【发布时间】:2015-09-13 21:17:08
【问题描述】:
我目前正在处理一些二进制数据。 为了检查和调试以前由我的应用程序生成的数据,我使用 hexdump,面对 hexdump 似乎无法提取 64 位整数字段的障碍。 给定以下最小示例:
#include <iostream>
#include <fstream>
#include <cstdint>
int main(int argc, char** argv){
std::ofstream os("tmp.bin", std::ios::out | std::ios::binary);
uint64_t x = 7;
os.write((char*)&x,sizeof(uint64_t));
os.close();
return 0;
}
我在我的系统上执行了一个简单的 hexdump:
hexdump tmp.bin
> 0000000: 0007 0000 0000 0000
> 0000008:
现在尝试提取 64 位宽度的无符号整数:
hexdump -e '/8 "%u"' tmp.bin
> hexdump: bad byte count for conversion character u
根据写得好的hexdump-manual by David Mair应该是可以做到的,但是我没有成功。
我错过了什么?
【问题讨论】:
-
不幸的是,这只会修改输出的缩进宽度。
-
在手册页中说 x 和 u 最多只支持 4 个字节。无论如何,经过一番抨击后,我发现了这个解决方法: hexdump -e '2/4 "%08X" "\n"' FILE | awk '{system("echo \"ibase=16; "$1"\"|bc")}' 它基本上打印两个 4 字节十六进制对,然后使用 bc 将其转换为十进制。我不知道2个十六进制对的顺序是否需要交换正确的值,但你可以试一试。
-
好吧,我刚试了一下。这些值确实必须交换。它是这样工作的: hexdump -e '2/4 "%08X " "\n"' HEX | awk 'BEGIN{printf "ibase=16; "}{print $2 $1}' | bc 谢谢。
-
好的,现在我点击签名号码。因为我不知道它们是否使用符号位、一个补码、二进制补码、偏移二进制或负基本表示来表示,所以对于快速转储来说太多了。所以我们的解决方案只适用于无符号 64 位整数。
-
最终你想出了答案 ;)
标签: c++ binary 64-bit reverse-engineering hexdump