Bash 脚本 - 将编码的字符串解码为字节数组

Mad*_* CM 1 linux bash shell

我是 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)

有什么想法吗?

Kam*_*Cuk 6

到字节数组

shell 中没有“字节数组”。您基本上可以从两种类型的变量中进行选择:

  • 一个字符串
  • 字符串数组(bash 扩展名,并非在所有 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 表示的数字。这可能与“字节数组”尽可能接近。