如何从文件中提取单个字节块?

Dan*_*anM 66 linux split file

在Linux桌面(RHEL4)上,我想从大文件(> 1 Gig)中提取一系列字节(通常小于1000).我知道文件的偏移量和块的大小.

我可以编写代码来执行此操作但是有命令行解决方案吗?

理想情况下,例如:

magicprogram --offset 102567 --size 253 < input.binary > output.binary
Run Code Online (Sandbox Code Playgroud)

Tho*_*thy 99

试试dd:

dd skip=102567 count=253 if=input.binary of=output.binary bs=1
Run Code Online (Sandbox Code Playgroud)

  • 下面是使用十六进制偏移的示例:`dd if = in.bin bs = 1 status = none skip = $((0x88))count = $((0x80))of = out.bin`. (9认同)
  • 可以选择添加`status = none`来禁止输出到stderr. (2认同)
  • 您使用 bs=1 和 count=253 而不是相反的原因有什么具体原因吗?更大的块大小会使命令更有效吗? (2认同)
  • bs=1 的加载速度比 bs=1000 慢。事实上,我在一次简短的测试中看到了 500 的因子。 (2认同)

Chr*_*ger 39

这是一个老问题,但我想添加另一个dd更适合大块字节的命令版本:

dd if=input.binary of=output.binary skip=$offset count=$bytes iflag=skip_bytes,count_bytes 
Run Code Online (Sandbox Code Playgroud)

where $offset$bytes是以字节为单位的数字.

与托马斯接受的答案的不同之处在于,bs=1这里没有出现.bs=1产生的输入和输出块大小为1字节,这使得当提取的字节数很大时非常慢.

  • 这确实比我的答案快得多. (2认同)
  • @Timmmm GNU `dd` 可用于 `iflag` 支持(`brew install coreutils`)。注意:默认情况下,实用程序安装时带有“g”前缀(例如“gdd”而不是“dd”) (2认同)

Cir*_*四事件 6

head -c + tail -c

不确定dd效率如何,但它很有趣:

printf "123456789" | tail -c+2 | head -c3
Run Code Online (Sandbox Code Playgroud)

从第二个开始选择3个字节:

234
Run Code Online (Sandbox Code Playgroud)

另请参阅:https : //stackoverflow.com/a/1272995/895245

  • 比 bs=1 的 dd 快得多,谢谢!请注意,tail 从 1 开始计数字节,而不是从 0 开始计数。此外,当 head 过早关闭其输出时,tail 会以错误代码 1 退出。使用“set -e”时请务必忽略该错误。 (2认同)