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[*]}"
请注意,在 中ksh93
,printf '%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