![CentOS 7 でバイナリ ファイルを base64 でエンコードする正しい方法は何ですか?](https://rvso.com/image/134418/CentOS%207%20%E3%81%A7%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%20base64%20%E3%81%A7%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E6%AD%A3%E3%81%97%E3%81%84%E6%96%B9%E6%B3%95%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
私は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
。