- 此问题在此处已有答案**:
How do I extract a single chunk of bytes from within a file?(6个答案)
5年前关闭。
我试图从一个二进制文件中复制一个块到一个新文件中。我有我想抓取的块的字节偏移量和长度。
我试过使用dd
实用程序,但这似乎读取并丢弃了偏移量之前的数据,而不是仅仅查找(我猜是因为dd
用于复制/转换数据块)。这使得它相当慢(偏移量越大,速度越慢)。
dd if=inputfile ibs=1 skip=$offset count=$datalength of=outputfile
我想我可以编写一个小的Perl/Python/whatever脚本来打开文件,查找偏移量,然后以块的形式读写所需数量的数据。
是否有实用程序支持这样的功能?
6条答案
按热度按时间vulvrdjw1#
您可以使用
tail -c+N
从输入中修剪前N个字节,然后使用head -cM
仅输出其输入中的前M个字节。所以使用变量,它可能是:
啊,没看到它必须寻找。留下这个作为社区维基。
wfauudbj2#
是的,现在用dd做这个很难。我们考虑在coreutils中给dd添加skip_bytes和count_bytes参数,不过下面的应该可以:
f2uvfpb93#
谢谢你的回答。不幸的是,我没有能力安装额外的软件,所以ddrescue选项被取消了。head/tail解决方案很有趣(我不知道你可以提供+到tail),但是扫描数据会让它很慢。
我最后写了一个小的python脚本来完成我想要的。缓冲区大小可能应该调优为与一些外部缓冲区设置相同,但使用下面的值在我的系统上性能已经足够了。
w8ntj3qf4#
您可以使用
ddrescue的选项。
zlhcx6iw5#
根据
man
dd
on FreeBSD:skip=
* n *复制前跳过输入开头的 * n * 个块。**在支持寻道的输入上,使用lseek(2)操作。**否则,读取并丢弃输入数据。对于管道,读取正确的字节数。对于所有其他设备,读取正确的块数,而不区分正在读取的是部分块还是完整块。
使用
dtruss
,我验证了它确实在Mac OS X上的输入文件上使用lseek()
。如果你只是认为它很慢,那么我同意评论,这将是由于1字节的块大小。50pmv0ei6#
您可以尝试hexdump命令:
例如)从偏移量100开始读取“mycorefile”中的100个字节。
然后,如果需要,使用另一个脚本将输出的所有行合并为一行。
如果您只想查看内容: