bash中的hex到ascii

时间:2018-05-16 17:40:22

标签: string bash

我有一个包含ascii值和\000的二进制文件:它的名称是 input ,这是它的hexdump(xxd -c 1):

0000000: 68  h
0000001: 65  e
0000002: 6c  l
0000003: 6c  l
0000004: 6f  o
0000005: 20
0000006: 00  .
0000007: 20
0000008: 77  w
0000009: 6f  o
000000a: 72  r
000000b: 6c  l
000000c: 64  d

我正在尝试创建一个脚本来解析此文件,并将字符串生成为空字节。

这是我到目前为止的尝试:

buf=""
for x in $(xxd -p -c 1 input); do
    echo "x   = $x"
    if [ ${x} == 00 ]; then
        echo "break"
        break;
    else
        y=$(echo $x | xxd -r)
        echo "y   = $y"
        echo "buf = $buf"
        buf="$buf$y"
    fi
done
echo $buf

输出结果为:

x   = 68
y   =
buf =
x   = 65
y   =
buf =
x   = 6c
y   =
buf =
x   = 6c
y   =
buf =
x   = 6f
y   =
buf =
x   = 20
y   =
buf =
x   = 00
break

所以至少我在正确的时间打破了循环,但我不明白为什么作业没有正确发生

2 个答案:

答案 0 :(得分:1)

好的,想通了。

xxd -r期望0x作为标识十六进制数字的前缀。这解决了我的问题:

y=$(echo "0x$x" | xxd -r)

虽然,我必须承认这很奇怪,因为我认为echo "a" | xxd -p | xxd -r应该会产生原始信件

答案 1 :(得分:0)

有一个更好的解决方案! head支持NUL作为行分隔符。尝试

head -zn1 input

如果您需要其他字段,请尝试

head -zn7 input | tail -zn1