web-dev-qa-db-ja.com

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

CentOS 7とbash Shellを使用しています。バイナリファイルの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の倍数ではないというエラーメッセージが表示されるので、上記で私がしたことが正しいのか、それを行う他の方法があるのか​​疑問に思いました。

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

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

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

5
ilkkachu

base64は、適度に長い文字列に対して複数行を書き込むため、ファイルサイズから正しい数の改行を差し引く必要があります。一部のシステムでは、ユーティリティがDOSテキストファイルを書き込むことがあります(base64 from GNU coreutils、ただし実装は fourmilab BSDシステムで一般的)、この場合、長さを取得するには1行あたり2バイトを差し引く必要がありますエンコードされた文字列の。


コメントの質問への応答:「新しい先取特権または他のガベージなしで生のbase64文字列を取得するにはどうすればよいですか?base64文字列だけですか?」

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

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

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

base64 from GNU coreutils、あなたは使うことができます

base64 -w0 filename >outfilename
2
Kusalananda

マニュアルによると:

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のようなものを提案します。

0
DopeGhoti