如何在Unix中从文件中提取特定字节

10

如何从二进制文件中提取位于特定位置的12字节块。

如果我想要提取前12字节,我可以这样做:

head -c12 file.bin>output

如果我想从byte61中提取12个字节,我可以这样做

head -c72 file.bin|tail -c12 >output

如果我需要提取20个12字节的块,是否有更简单的方法?

谢谢


如果有价值的话,你可以编写一个 shell 函数,并使用与你之前完全相同的命令来提供需要处理的值。 - elig
2个回答

17

使用dd命令:

dd bs=1 seek=60 count=12 if=file.bin of=output

你可以编写一个shell循环来替换这些数字。

如果有大量数字需要处理或需要快速处理,也可以考虑使用awk、Perl或Python。


16
在使用coreutils 8.13版本的Linux上,将iseek替换为skipdd bs=1 skip=60 count=12 if=file.bin of=output - Ludwig Weinzierl

0

使用xxd:

xxd -p -seek 3d -l 12 file.bin > output

3d 在十六进制中表示为 61

使用 hexdump:

hexdump -ve '16/1 "%0.2x " "\n"' -s 3d -n 12 file.bin > output

1
“-seek” 实际上接受一个十进制字符串并会默默地丢弃错误。我猜它使用的是 atoi(),这个 API 真的很糟糕。所以,“3d” 实际上意味着 3。是的,这很愚蠢。 - Timmmm
它实际上使用了strtol,它提供了一种检查错误的方法,但显然大多数人并不关心。 - Timmmm
最后注意,strtol 支持十六进制输入(0xff),还支持疯狂的八进制模式(0777)。所以要小心! - Timmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接