如何在 korn shell 中将文本或字符转换为十六进制

如何在 korn shell 中将文本或字符转换为十六进制

unix korn shell 是否提供将文本或字符转换为十六进制的功能,例如。十六进制 31 32 37 33 34 35 35 36 36 37 字符值 1273455667 这里我已经编写了要显示的代码,但我不知道如何将结果存储在变量中

str=1273455667

for (( i=0; i < ${#str}; i++ ))
do
c=${str:$i:1}
if [[ $c == ' ' ]]
then
printf "[%s] %X\n" " " \'\ \'
else
printf "[%s] %X\n" "$c" \'$c\'
fi
done

答案1

如果你有hexdump(这很可能),你可以这样做:

$ echo "Hello, world!" | hexdump -v -e '/1 "[%_c]: "' -e '/1 "%02X\n"'
[H]: 48
[e]: 65
[l]: 6C
[l]: 6C
[o]: 6F
[,]: 2C
[ ]: 20
[w]: 77
[o]: 6F
[r]: 72
[l]: 6C
[d]: 64
[!]: 21
[\n]: 0A

对于将简单的空格分隔的十六进制转储到变量中:

$ v=$(printf %s 1273455667 | hexdump -v -e '/1 "%02X "')
$ echo "$v"
31 32 37 33 34 35 35 36 36 37

答案2

str=1273455667
unset hex_values
for (( i=0; i < ${#str}; i++ )); do
  c=${str:i:1}
  hex_values+=($(printf "%X" "'$c"))
done

echo "${hex_values[*]}"

请注意,在 中ksh93printf '%X\n' "'$character"给出的是字符的代码点,而不是在当前编码中形成该字符的字节的十六进制值。从这一点来说,它与od -An -vtx1.

例如,在 UTF-8 语言环境中,对于 €(在 UTF-8 中编码为 e2 82 ac),它将给出 20ac(欧元符号的 unicode 代码点),而不是 e2 82 ac。

od如果将区域设置强制为 C(使用export LC_ALL=C),您可以获得与中相同的行为。

在这里,我们使用命令替换 ( $(...)) 来检索命令的输出。在 中ksh93,当命令是内置的时,不涉及创建管道和分叉子 shell,因此相对高效。

答案3

I occasionally do this to insert binary strings into an sqlite db
# Convert a string to hex using od
cat testfile   |
od -An -td1 | 
{
 print -n "x'"
 while read aline
 do    for i in $aline 
       do  print -n "%02x"
       done | read format
       printf "$format" $aline
 done 
 print "'"
} | read hexstr
echo "$hexstr"

答案4

您可以使用 awk丝绒库:

velour -n '
do print mt_basecon(str_ord(ARGV[1]), 10, 16)
while (ARGV[1] = str_slice(ARGV[1], 2))
' 1273455667

结果:

31
32
37
33
34
35
35
36
36
37

相关内容