我目前正在处理一些二进制数据。 为了检查和调试我的应用程序先前生成的数据,我使用 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,应该可以做到,但我没有成功。
我错过了什么?
答案 0 :(得分:3)
我们的最终解决方法如下:
x=`hexdump -n 8 -e '2/4 "%08X " "\n"' {FILENAME} | awk 'BEGIN{printf "0x"}{print $2$1}'`
echo $(($x))
每个部分的解释:
从文件{FILENAME}中提取64位整数值的八个字节 将两个四字节块打印为十六进制编码值。
hexdump -n 8 -e '2/4 "%08X " "\n"' {FILENAME}
反转两个块的字节顺序,并将其打印为表示二进制值的单个八字节块。在 0x 前面进行以下处理。
awk 'BEGIN{printf "0x"}{print $2$1}
将十六进制表示保存到x中以供bash评估。
x=`....`
让bourne shell解释并输出64位整数变量的十六进制编码值(这里需要先前加上 0x )。
echo $(($x))
答案 1 :(得分:1)
也可以使用sed。以下匹配8字节十六进制整数并交换它们。同样,这仅适用于无符号整数。
hexdump ... | sed 's/0x\([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\)/0x\2\1/'
AFAICT应该能够写得更清楚
hexdump ... | sed 's/0x\([0-9a-f]{8,8}\)\([0-9a-f]{8,8}\)/0x\2\1/'
通常使用某些命令行选项(如-E)来启用扩展正则表达式,但至少在Mac OS X 10.10上这不起作用。
答案 2 :(得分:0)
我不明白为什么这不能立即使用,但是我在打印64位整数时遇到了同样的问题,最终从util-linux
编译了一个更好的版本:{ {3}}。最初,我尝试在Ubuntu中安装该软件包,但并未更新hexdump
,因此我决定尝试“手动”进行安装。
需要一些工作,但还算不错。只需使用git
来获取源代码,运行autogen.sh
脚本,然后依次运行./configure
和make hexdump
即可编译该程序。在我的笔记本电脑上,编译只花了4秒钟。
答案 3 :(得分:0)
请尝试使用“ od”命令。 od -xL输出长整数