执行反向十六进制转储
于 2008 年 6 月 2 日
如果您使用命令行,您很可能使用过hexdump或od来转储二进制文件,但是如果您有一个十六进制转储,并且想要创建数据的二进制版本,您该怎么办? 假设您的需求不是太复杂,答案可能是xxd。您可以像使用xxd一样使用hexdump和od来转储二进制文件,但您也可以使用它来反向操作:将十六进制转储转换回二进制文件。
如果您只使用文件名运行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。 在 OpenSuSE 中xxd是 vim-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查看完整脚本请点击这里