CentOS 7 でバイナリ ファイルを base64 でエンコードする正しい方法は何ですか?

CentOS 7 でバイナリ ファイルを base64 でエンコードする正しい方法は何ですか?

私はCentOS 7をbashシェルで使用しています。バイナリファイルをbase64エンコードするのは次のように簡単だと思っていました。

[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64

しかし、ファイルの長さを見ると、4の倍数ではないことに気付きました。

[rails@server lib]$ ls -al /tmp/output.base64 
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64

私が行ったことが有効かどうかはわかりませんが、JS ライブラリを使用してファイルをデコードしようとすると、文字列の長さが 4 の倍数ではないというエラーが表示されるため、上記の操作が正しいのか、それとも別の方法があるのだろうかと思っています。

答え1

$ echo foo |base64 
Zm9vCg==
$ echo foo |base64 |wc -c
9

の出力の末尾の改行に注目してくださいbase64。ここでは 9 番目の文字です。

入力が長い場合、デフォルトでは 76 文字ごとに出力が折り返されるため、複数の行が生成されます。 を使用するか、base64 -w0出力を にパイプすることで、折り返し (最後の改行を含む) を無効にすることができますtr -d '\n'

答え2

base64中程度の長さの文字列は複数行に書き込まれるため、ファイルサイズから改行の正しい数を差し引く必要があります。一部のシステムでは、ユーティリティはDOSテキストファイルを書き込む場合があります(base64GNU coreutilsではなく、フォーミラボBSD システムでは一般的) の場合、エンコードされた文字列の長さを取得するには、行ごとに 2 バイトを差し引く必要があります。


コメントの質問への回答: 「新しいリーンやその他のゴミなしで生の base64 文字列を取得するにはどうすればよいですか? base64 文字列だけですか?」

base6476 文字は MIME でエンコードされたテキスト行の最大長であるため、76 文字ごとに改行を挿入します (また、電子メールの Base 64 Content-Transfer-Encoding を作成するために Base 64 が最もよく使用されます)。

これらの改行を削除する場合:

base64 filename | tr -d '\n\r' >outfilename

base64GNU coreutilsでは、

base64 -w0 filename >outfilename

答え3

マニュアルによると:

SYNOPSIS
       base64 [OPTION]... [FILE]

DESCRIPTION
       Base64 encode or decode FILE, or standard input, to standard output.

       With no FILE, or when FILE is -, read standard input.

あなたのやっていることは正しいように思えますが、 の無駄な使用法を呼び出すのではなくcat、 のようなものを提案したいと思いますbase64 file > file.b64

関連情報