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の倍数ではないというエラーメッセージが表示されるので、上記で私がしたことが正しいのか、それを行う他の方法があるのか疑問に思いました。
$ echo foo |base64
Zm9vCg==
$ echo foo |base64 |wc -c
9
base64
の出力の末尾の改行に注意してください。これは、ここでは9番目の文字です。
長い入力の場合、出力はデフォルトで76文字ごとに折り返されるため、複数の行が生成されます。 base64 -w0
を使用するか、tr -d '\n'
を介して出力をパイプ処理することにより、ラッピング(最後の改行を含む)を無効にできます。
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
マニュアルによると:
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
のようなものを提案します。