bash中的hex到ascii

问题描述 投票:1回答:2

我有一个包含ascii值和\000的二进制文件:它的名字是输入,这是它的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

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

string bash
2个回答
1
投票

好吧,想通了。

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

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

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


0
投票

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

head -zn1 input

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

head -zn7 input | tail -zn1
© www.soinside.com 2019 - 2024. All rights reserved.