使用标准的Linux命令行工具修改二进制文件中的一个字节

9
我需要在二进制文件的特定偏移量处修改一个字节。
示例:
输入文件:A.bin 输出文件:B.bin 我需要从A.bin的偏移量0x40c读取一个字节,将该字节的最低有效位清零2位,然后写入文件B.bin等于A.bin,但是在偏移量0x40c处使用计算出的字节。
我可以使用Bash和像printfdd这样的标准命令。
我可以轻松地将一个字节写入二进制文件,但我不知道如何读取它。
使用标准Linux命令行工具修改二进制文件中的一个字节。

http://unix.stackexchange.com/questions/155085/fetching-individual-bytes-from-a-binary-file-into-a-variable-with-bash? - Freek Wiedijk
可能是[CLI:在地址处写入字节(hexedit /从命令行修改二进制文件)]的重复问题(https://dev59.com/vW445IYBdhLWcg3wmLZd)。 - eadmaster
问题是什么?它被说明为家庭作业或工作指令。 - Peter Mortensen
1个回答

10
# Read one byte at offset 40C
b_hex=$(xxd -seek $((16#40C)) -l 1 -ps A.bin -)

# Delete the three least significant bits
b_dec=$(($((16#$b_hex)) & $((2#11111000))))
cp A.bin B.bin

# Write one byte back at offset 40C
printf "00040c: %02x" $b_dec | xxd -r - B.bin

该程序在 Bash 和 Z shellzsh)下在 OS X 和 Linux 上进行了测试。

最后一行的解释:

  • 00040c:xxd 应该写入的偏移量
  • %02x 将变量 $b 从十进制转换为十六进制
  • xxd -r - B.bin: 反转十六进制转储数据(xxd -r) — 从标准输入中取出字节编号和十六进制值,然后写入 B.bin

我已经点赞你的回答,因为我喜欢它,但是OP要求两个不同的文件,所以在最终的dd之前应该将cp A.bin B.bin放在某个地方,这将操作B.bin;更重要的是,如果$b等于ASCII NUL,则此方法无效... - Dario
@Dario 谢谢你指出它应该在一个新文件上运行,我已经添加了。 - hansaplast
@Dario 谢谢你的 xxd 建议。我改变了最后一行和读取方式。现在我不需要 ord 函数了,所以代码现在被简化为了 4 行。你能帮我校对一下,看看我没有添加任何错误吗? - hansaplast
1
关于“获取行号”:但这是一个二进制文件(?)。 - Peter Mortensen
@PeterMortensen 没错,我在答案中修复了它。另外:感谢您的编辑! - hansaplast
显示剩余4条评论

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