C++ 奇怪的十六进制格式

C++ 奇怪的十六进制格式,c++,c,file-io,hex,decimal,C++,C,File Io,Hex,Decimal,下面的hextump显示了我手上的设备生成的一些数据。它以一种奇怪的方式存储年、月、日、时、分、秒和长度(4个字节的符号表示一位数,顺序相反) 例如: 年份标记为“000007de”即0x07de(=2014)。现在;我遇到的问题是如何在c/c++中正确处理这个问题。(前4个字节) 我如何以“反向”顺序读取这4个字节,以便生成适当的十六进制,以便以后使用类似的int/long进行处理?如果在生成该值的相同体系结构上读取值为int,则无需执行任何操作,因为这是系统的自然格式 如果您想在不同的体系结

下面的hextump显示了我手上的设备生成的一些数据。它以一种奇怪的方式存储年、月、日、时、分、秒和长度(4个字节的符号表示一位数,顺序相反)

例如: 年份标记为“000007de”即0x07de(=2014)。现在;我遇到的问题是如何在c/c++中正确处理这个问题。(前4个字节)


我如何以“反向”顺序读取这4个字节,以便生成适当的十六进制,以便以后使用类似的int/long进行处理?

如果在生成该值的相同体系结构上读取值为
int
,则无需执行任何操作,因为这是系统的自然格式

如果您想在不同的体系结构、不同的二进制格式上阅读它,您只需要对此做些什么

所以你可以简单地用

 int32_t n;
 fread(&n, sizeof int32_t, 1, FILE);

当然,文件必须以二进制模式打开,并且您需要一个32位int。

如果您以相反的顺序读取它,那么您可以使用如下方式更改尾数:

uint32_t before = 0xde070000;
uint32_t after = ((before<<24) & 0xff000000) |
                 ((before<<8)  & 0xff0000)   |
                 ((before>>8)  & 0xff00)     |
                 ((before>>24) & 0xff);
uint32\u t before=0xde070000;
uint32\u t after=((24之前)和0xff);

编辑:正如注释中所指出的,这仅为无符号32位转换定义。

将它们读入
int32\t
并使用
ntohl()
这对有符号整数执行左移位,当有溢出或值为负时,其行为未由C标准定义,对有符号整数执行右移位,它具有实现定义的行为。您是对的,它仅为无符号32位转换定义。
uint32_t before = 0xde070000;
uint32_t after = ((before<<24) & 0xff000000) |
                 ((before<<8)  & 0xff0000)   |
                 ((before>>8)  & 0xff00)     |
                 ((before>>24) & 0xff);