
私は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テキストファイルを書き込む場合があります(base64
GNU coreutilsではなく、フォーミラボBSD システムでは一般的) の場合、エンコードされた文字列の長さを取得するには、行ごとに 2 バイトを差し引く必要があります。
コメントの質問への回答: 「新しいリーンやその他のゴミなしで生の base64 文字列を取得するにはどうすればよいですか? base64 文字列だけですか?」
base64
76 文字は MIME でエンコードされたテキスト行の最大長であるため、76 文字ごとに改行を挿入します (また、電子メールの Base 64 Content-Transfer-Encoding を作成するために Base 64 が最もよく使用されます)。
これらの改行を削除する場合:
base64 filename | tr -d '\n\r' >outfilename
base64
GNU 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
。