2016-07-25 107 views
1

我想在shell腳本中將一些十六進制值編碼爲base64。Base64編碼新行

[email protected]:~$ echo -n "1906 1d8b fb01 3e78 5c21 85db 58a7 0bf9 a6bf 1e42 cb59 95cd 99be 66f7 8758 cf46 315f 1607 66f7 6793 e5b3 61f9 fa03 952d 9101 b129 7180 6f1d ca93 3494 55e0 0e2e" | xxd -r -p | base64 
GQYdi/sBPnhcIYXbWKcL+aa/HkLLWZXNmb5m94dYz0YxXxYHZvdnk+WzYfn6A5UtkQGxKXGAbx3K 
kzSUVeAOLg== 

我得到一個自動換行符76後,有沒有辦法避免這種情況?

在線我發現,使用「-n」忽略新行......任何人都可以提出一些建議嗎?

+1

這實際上不是一個bash的問題 - 這取決於你的xxd'和'base64'的'實現,這是由操作系統提供,而不是由慶典。 –

+0

我有一個通過base64編碼的cookie值,當我解碼它時,我得到64個十六進制值....現在我試圖將它編碼回到那個cookie值...應該不會有任何換行符。 。 –

+0

...此外,'echo -n'實際上是(根據POSIX標準的回聲)未定義的行爲;例如,如果'set -o posix; shopt -s xpg_echo「已經運行,命令'echo -n hello'將在其輸出中發出'-n hello'。如果您想要可靠和一致的行爲,請考慮'printf',並參閱http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html –

回答

8

echo -n實際上並不無論這裏:它控制是否有從echo輸出一個換行符,但echo是否發出的換行xxdbase64是否發出新行沒有關係。

由於xxd忽略在輸入任何尾隨換行符,echoecho -n將表現完全相同這裏;是否有echo的換行符沒有區別,因爲換行(如果存在)在讀取輸入時將被xxd使用。相反,你最終關心的是base64的輸出,這是產生你最終結果的原因。


假設你擁有的base64的GNU版本,添加-w 0在其輸出禁用自動換行。因此:

printf '%s' "1906 1d8b fb01 3e78 5c21 85db 58a7 0bf9 a6bf 1e42 cb59 95cd 99be 66f7 8758 cf46 315f 1607 66f7 6793 e5b3 61f9 fa03 952d 9101 b129 7180 6f1d ca93 3494 55e0 0e2e" \ 
    | xxd -r -p \ 
    | base64 -w 0 
+0

謝謝......它解決了我對第一個疑惑......感謝再次提供這種及時的答覆。 –

+0

'echo「foo」| base64 -w 0;回聲「酒吧」| base64 -w 0'將兩個結果連接在一行上。 'echo「foo」| base64 -w 99999;回聲「酒吧」| base64 -w 99999'將返回2行,每行結果爲1行。如果你有一個你想要'base64'的字符串列表,這很有用。 – ckeeney

+0

那時候,我寧願'base64 -w 0 <<<「foo」;回聲; base64 -w 0 <<<「bar」; echo「來使事情變得明確 - 這樣,你就沒有圍繞64位編碼成超過99,999個字符的字符串的內容。 –