2016-10-05 103 views
1

使用Bash中的base64解碼消息(可能包含特殊字符)。保存到文件將產生48個字節的數據。但是,如果將它傳遞給一個變量,它將變成一個41字節的字符串。我相信這是由Bash處理特殊字符(^ @)的方式造成的。Bash中的字節數組(可能包含特殊字符)

舉個例子,

meow_bash=`printf $variable | base64 --decode` 
echo ${#meow_bash} # return 41 

printf $variable | base64 --decode > meow 
wc -c meow # return 48 

現在,如果我不希望保存由於數據的敏感性質以文件的陣列。我也需要使用shell腳本來完成它。有沒有辦法讓我使用bash/sh來成功傳遞它?

+0

^@是一個nul字節,不能存儲爲bash變量或作爲參數傳遞給任何程序。不要對bash數據使用bash。您可以存儲base64,並在您將其寫入任何內容時將其轉換。 –

+0

IIRC我也看到bash(我認爲它是一箇舊版本)被刪除字符(十六進制7f)弄糊塗了。根據語言環境的不同,有些工具可能會拒絕處理因此,處理二進制數據的shell工具將採用base64(或十六進制或類似的東西)或通過管道。 –

回答

4

請學會引用您的擴展:使用printf "$variable",不printf $variable

這個最簡單的原因是,C變量定義爲在零字節結束。
因此c字符串不能包含零字節。
Bash(正在寫成c),默默刪除變量中的任何零值。

但是可以在流中使用零字節(管道等)。

簡單的解決方法是不存儲變量內的值(解碼後)。

另請注意,變量可能包含以base64編碼存儲的任何字節值。

因此,變量可以被分配安全 base64編碼值:

使用在管內的變量的值擦除沒有字節:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ printf '%s' "$variable" | base64 --decode | wc -c 
18 

即:一個流可能包含零值字節。

但分配解碼值給變量:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ meow_bash="$(printf '%s' "$variable" | base64 --decode)" 
$ printf '%s' "$meow_bash" | wc -c 
15 
$ echo "${#meow_bash}" 
15 

可變$meow_bash已經失去了3個爲零字節。

+0

我想回家的消息將是:不要將任何字節數組直接分配給bash變量,不管... ... – Chong

相關問題