如何让xxd -r忽略地址列,直接转换十六进制dump为对应二进制数据?
问题描述
我使用命令memtool md -b 0x58040000+128K > rom.hex导出PCIe卡的Option ROM,生成的rom.hex文件中地址列从0x58040000开始。随后用xxd -r rom.hex rom.bin转换为二进制文件时,生成的rom.bin体积达1476788224字节——这是因为xxd默认从地址0开始生成文件,而非目标起始地址0x58040000,导致文件前有大量空字节。目前需要额外用dd等工具裁剪才能得到128K的ROM二进制文件,请问如何让xxd忽略地址列,仅转换数据部分?
解决方法
可以通过先过滤掉rom.hex中的地址列,再用xxd的纯十六进制模式转换来解决,无需后续裁剪操作,具体有两种常用方式:
方式一:用sed过滤地址前缀
如果rom.hex每行格式为0x5804xxxx: 数据内容,用sed移除每行开头的地址和冒号,再通过xxd转换:
sed 's/^0x[0-9a-fA-F]*://' rom.hex | xxd -r -p > rom.bin
sed命令:匹配并删除每行开头的十六进制地址(如0x58040000:)xxd -r -p:-p参数启用纯十六进制模式,忽略所有地址信息,仅将输入的十六进制字符串转换为二进制数据
方式二:用awk提取数据列
如果rom.hex每行的地址和数据以空格分隔,直接用awk提取数据部分:
awk '{print $2}' rom.hex | xxd -r -p > rom.bin
awk '{print $2}':提取每行的第二列(即数据部分)- 后续
xxd -r -p的作用和方式一一致
通过上述方法生成的rom.bin就是准确的128K大小的Option ROM二进制文件,无需额外裁剪。
内容的提问来源于stack exchange,提问作者bruin
相关产品推荐
相关产品推荐

