在 CentOS 7 上對二進位檔案進行 Base64 編碼的正確方法是什麼?

在 CentOS 7 上對二進位檔案進行 Base64 編碼的正確方法是什麼?

我正在使用帶有 bash shell 的 CentOS 7。我認為對二進位進行 Base64 編碼會很簡單

[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64

但是,我注意到當我查看文件長度時,它不是四的倍數

[rails@server lib]$ ls -al /tmp/output.base64 
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64

我不知道我所做的是否有效,但是當我嘗試使用 JS 庫解碼檔案時,我收到一個錯誤,抱怨字串長度不是四的倍數,所以我想知道我上面所做的是否正確,或者是否有其他方法可以做到這一點。

答案1

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

請注意 輸出中的尾隨換行符base64,它是此處的第九個字元。

對於較長的輸入,它將產生不只一行,因為預設情況下它每 76 個字元換行一次輸出。您可以使用base64 -w0或透過管道輸出來停用換行(包括最後的換行符號)tr -d '\n'

答案2

base64為中等長度的字串寫入多行,因此您必須從檔案大小中扣除正確的換行數。在某些系統上,該實用程式可能會寫入 DOS 文字檔案(不是使用base64GNU coreutils 的,而是使用來自 GNU coreutils 的實作)福爾米實驗室在 BSD 系統上很常見),在這種情況下,您必須每行扣除 2 個位元組才能獲得編碼字串的長度。


回答評論中的問題:“如何在沒有任何新的留置權或其他垃圾的情況下獲得原始的 Base64 字符串?只是 Base64 字符串?”

base64在每 76 個字元後插入換行符,因為 76 個字元是 MIME 編碼文字行的最大長度(並且 Base 64 最常用於為電子郵件建立 Base 64 內容傳輸編碼)。

如果您想刪除這些換行符:

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

透過base64GNU 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

相關內容