我是 bash 脚本的新手,我正在编写一个小脚本,我需要对编码的字符串进行解码并将其转换为字节数组。
my_array=(`echo "dGVzdA==" | base64 -d`)
Run Code Online (Sandbox Code Playgroud)
当我打印数组的大小时,它显示为 1 而不是 4。
echo "${#my_array[*]}"
Run Code Online (Sandbox Code Playgroud)
问题 - 不会base64 -d转换为字节数组?有一个等效的 java 代码,它对我有用:
byte [] b = Base64.getDecoder().decode("dGVzdA==");
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
到字节数组
shell 中没有“字节数组”。您基本上可以从两种类型的变量中进行选择:
您如何解释数据取决于您,shell 只能存储字符串。Bash 有一个名为“bash arrays”的扩展,它允许创建一个数组。请注意,字符串以零结尾 - 不可能存储零字节。
问题 - 它不会将 base64 -d 转换为字节数组吗?
该字符串dGVzdA==是 base64 编码的 string test。所以你可以将字符串转换dGVzdA==为字符串test:
$ echo "dGVzdA==" | base64 -d
test# no newline is printed after test, as the newline is not in input
Run Code Online (Sandbox Code Playgroud)
有什么想法吗 ?
您可以将字符串 转换为包含每个字节表示为十六进制数test的字符串,通常使用:xxd
$ echo "dGVzdA==" | base64 -d | xxd -p
74657374
Run Code Online (Sandbox Code Playgroud)
现在,您可以在字符串中的每两个字符后插入一个换行符,并将输出作为换行符分隔的字符串列表读取到数组中:
$ readarray -t array < <(echo "dGVzdA==" | base64 -d | xxd -p -c1)
$ declare -p array
declare -a array=([0]="74" [1]="65" [2]="73" [3]="74")
Run Code Online (Sandbox Code Playgroud)
数组的每个元素都是输入中的一个字节,表示为一个字符串,其中包含一个以 base16 表示的数字。这可能与“字节数组”尽可能接近。