Hexdump 能够读取二进制数据并对其进行适当格式化,以便将其(例如)传送到 awk,这一点非常有用,但我经常需要读取二进制数据与系统原生字节序不同的文件。特别是,我需要在小端机器上读取大端数据。我的理想解决方案是使用“hexdump”并添加一个开关来反转字节序,但这种开关似乎并不存在。
有没有什么好的“次优”解决方案可以解决这个问题?
答案1
是否有像 hexdump 这样的实用程序可以处理非本地字节序?
是的,这个实用程序叫做 Perl。
实际上数据::HexDumper- 尽管你可以自己动手。
数字格式 指定如何格式化数据的字符串。它可以是以下任意一种: 您会注意到它们与 perl 的 pack 函数具有相同的含义: C——无符号字符 S - 无符号 16 位,本机字节顺序 v 或 S< - 无符号 16 位,小端字节序 n 或 S> - 无符号 16 位,大端 L - 无符号 32 位,本机字节顺序 V 或 L< - 无符号 32 位,小端 N 或 L> - 无符号 32 位,大端 Q - 无符号 64 位,原生字节序 Q< - 无符号 64 位,小端字节序 Q>-无符号 64 位,大端
答案2
至少对于 16 位字,可以通过管道传输dd conv=swab
,
cat file.dat | dd conv=swab | od -t x2
答案3
$ objcopy -I binary -O binary --reverse-bytes=num inputfile.bin outputfile.bin
其中num
,16 位字为 2,32 位字为 4,64 位字为 8。
不幸的是,objcopy 没有接受输入stdin
或将输出写入的stdout
选项,因此为了将其用作管道,您需要编写一个创建临时文件的包装脚本。
此答案来自https://stackoverflow.com/a/19288235/1979048以及来自https://serverfault.com/a/329207/157443。
答案4
dd conv=swab < file.dat | hexdump