
我正在使用帶有 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 文字檔案(不是使用base64
GNU coreutils 的,而是使用來自 GNU coreutils 的實作)福爾米實驗室在 BSD 系統上很常見),在這種情況下,您必須每行扣除 2 個位元組才能獲得編碼字串的長度。
回答評論中的問題:“如何在沒有任何新的留置權或其他垃圾的情況下獲得原始的 Base64 字符串?只是 Base64 字符串?”
base64
在每 76 個字元後插入換行符,因為 76 個字元是 MIME 編碼文字行的最大長度(並且 Base 64 最常用於為電子郵件建立 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
。