我是bash的新手,我正在尝试将快速混淆转换为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)
有人知道这是可能的吗?
下面的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 "%dn" 0x{} |
# Join lines with comma
paste -sd, |
# Add spaces after comma
sed 's/,/, /g' |
# Add [ ]
{ echo -n '['; tr -d 'n'; echo ']'; }
# echo "[$(cat)]"
脚本不知道输入编码-脚本只转换字节表示。输入字符串必须已经是所需的编码。使用iconv
在编码之间进行转换。
使用纯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]