将字符串转换为 Unsigned int 8 数组

问题描述 投票:0回答:3

我是 bash 新手,我正在尝试将 swift 混淆 转换为 bash 脚本。

基本上,我想将字符串转换为 Unsigned-Int 8 数组(UTF-8)。

例如,

"hey" = [104, 101, 121] (UTF-8 UINT8 value)
"example" = [101, 120, 97, 109, 112, 108, 101] (UTF-8 UINT8 value)

有谁知道这是否可行?

bash shell
3个回答
1
投票

以下 shell 脚本将

hey
for 中的输入转换为字符串
[104, 101, 121]

# Print hey
printf "%s" hey |
# convert to hex one per line
xxd -p -c 1 |
# convert to decimal one per line
xargs -I{} printf "%d\n" 0x{} |
# Join lines with comma
paste -sd, |
# Add spaces after comma
sed 's/,/, /g' |
# Add [ ]
{ echo -n '['; tr -d '\n'; echo ']'; }
# echo "[$(cat)]"

脚本不知道输入编码 - 脚本仅转换字节表示。输入字符串必须已经采用所需的编码。使用

iconv
在编码之间进行转换。


0
投票

使用纯bash,无需外部程序:

#!/usr/bin/env bash                                                                                                                                                                                                                              

to_codepoints() {
    local LC_CTYPE=C IFS=, n
    local -a cps
    # Iterate over each byte of the argument and append its numeric value to an array                                                                                                                                                            
    for (( n = 0; n < ${#1}; n++ )); do
        cps+=( $(printf "%d" "'${1:n:1}") )
    done
    printf "[%s]\n" "${cps[*]}"
}

to_codepoints hey
to_codepoints example
to_codepoints $'\u00C4ccent'

输出

[104,101,121]
[101,120,97,109,112,108,101]
[195,132,99,99,101,110,116]

0
投票

使用od

echo "[$(echo -n "hey" | od -An -tu1 | awk -v OFS=', ' '{$1=$1;print}')]"

将打印

[104, 101, 121]
© www.soinside.com 2019 - 2024. All rights reserved.