执行反向十六进制转储

作者:Mitch Frazier

如果您使用命令行,您很可能使用过hexdumpod来转储二进制文件,但是如果您有一个十六进制转储,并且想要创建数据的二进制版本,您该怎么办? 假设您的需求不是太复杂,答案可能是xxd。您可以像使用xxd一样使用hexdumpod来转储二进制文件,但您也可以使用它来反向操作:将十六进制转储转换回二进制文件。

如果您只使用文件名运行xxd,它会以相当标准的十六进制转储格式转储数据

  # xxd bdata
  0000000: 0001 0203 0405                           ......
现在,如果您将输出通过管道传回给xxd,并使用 -r 选项将其重定向到一个新文件,您可以将十六进制转储转换回二进制文件
  # xxd bdata | xxd -r >bdata2
  # cmp bdata bdata2
  # xxd bdata2
  0000000: 0001 0203 0405                           ......
请注意,在使用xxd进行反向转换时,数据需要看起来像一个十六进制转储:需要有一个偏移量,并且数据需要正确格式化。 例如,这样是有效的
  # echo 01: 01 02 03 04 | xxd -r >output
但这样无效,因为数据格式不正确
  # echo 01: 1 2 3 4 | xxd -r >output

作为一个更具体的例子,我最近需要创建一个包含 MAC 地址的 Motorola S-Record 文件。 首先,我需要一种创建包含 MAC 地址的二进制文件的方法,以便我可以使用objcopy将其转换为 S-Record 文件。经过一番思考,没有产生好主意。 Linux 及其同类产品有很多用于操作文本的命令行实用程序,但用于操作二进制数据的实用程序并不多。 当然,我可以编写一个 C 程序来创建二进制文件或创建 S-Record 文件本身,但这似乎有点过分,因为我只谈论 6 个字节的数据。

经过一番搜索后,我找到了 xxd。 在 OpenSuSExxdvim-base 包的一部分。 我不确定它是否在所有发行版中都是这样,因为它似乎与vim.

没有任何关系。 该脚本接受一个 MAC 地址并输出 S-Record 数据

  # sh macid.sh 00:11:22:33:44:55
  S00D0000333737382D322E746D703B
  S1090000001122334455F7
  S9030000FC
可以选择指定一个地址来重新定位 S-Record 文件和一个输出文件名
  # sh macid.sh --address 0xffff0000 --output ma 00:11:22:33:44:55
  # cat ma
  S00D0000333733302D322E746D7047
  S30BFFFF0000001122334455F7
  S705FFFF0000FC
查看完整脚本请点击这里

Mitch Frazier 是 Emerson Electric Co. 的嵌入式系统程序员。Mitch 自 2000 年代初以来一直是Linux Journal的贡献者和朋友。

加载 Disqus 评论