我有一个包含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
所以至少我在正确的时间打破了循环,但我不明白为什么作业没有正确发生
答案 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