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

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

私はbashシェルでCentOS 7を使用しています。 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文字ごとに出力をラップするため、2行以上を生成します。base64 -w0出力を使用またはパイピングして、改行(最終的な改行を含む)を無効にすることができますtr -d '\n'

答え2

base64中間長文字列の場合は複数行が作成されるため、ファイルサイズから正しい改行数を減算する必要があります。一部のシステムでは、このユーティリティはDOSテキストファイルに書き込むことができます(base64GNU coreutilsを使用せずにGNU coreutilsの実装を使用する)。フォーミー研究所(BSDシステムで一般的です)、この場合、エンコードされた文字列の長さを取得するには、1行に2バイトを減算する必要があります。


コメントの質問に答えるには、「新しい先取券やその他のごみなしで生のBase64文字列をどのように取得しますか?Base64文字列だけを取得できますか?」

base6476文字はMIMEエンコーディングテキスト行の最大長であるため(Base 64は電子メールメッセージ用のBase 64コンテンツトランスポートエンコーディングを作成するために最も一般的に使用されます)、76文字ごとに改行が挿入されます。

これらの改行文字を削除するには:

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

GNU coreutilsを使用すると、base64次のことができます。

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

関連情報