反转内存空间的方向?

时间:2017-04-01 22:15:16

标签: c++ type-conversion

我正在尝试从文件中读取一些字节。

这就是我所做的:

struct HeaderData {
    char format[2];
    char n_trks[2];
    char division[2];
};

HeaderData* header = new HeaderData;

然后,直接从文件中获取数据到header我做

file.read(reinterpret_cast<char*>(header), sizeof(HeaderData))

如果前两个字节是00 06header->format[0]将是00header->format[1] 06。这两个数字的组合代表数字0x0006,即十进制的6,这是期望的值。

当我做

之类的事情时
*reinterpret_cast<unsigned*>(header->format) // In this case, the result is 0x0600

错误地返回数字0x0600,因此它似乎反转读取字节数。

我的问题是将数字正确读取为无符号的一些解决方法。

1 个答案:

答案 0 :(得分:1)

这将是一个字节序不匹配。

当您以这种方式从文件中读入时,字节将按照它们在文件中的确切顺序放入您的结构中。

当您从结构中读取unsigned时,处理器将按照架构要求的顺序解释这些字节(大多数是硬编码的,但有些可以设置为任一顺序)。

或者换句话说

  

这两个数字组合表示数字0x0006,即十进制数为6。

这不一定是真实的。您选择的处理器完全允许将十进制的6表示为0x06 0x00,这将是非常常见的处理器(如x86)上使用的little-endian方案。将其表示为0x00 0x06将是big-endian。

正如M.M在他的评论中所说,如果你的格式明确地将整数定义为小端,你应该明确地将它读作小端,例如format[0] + format[1] * 256,或者如果它被定义为big-endian,则应将其读作format[0] * 256 + format[1]。不要依赖处理器的字节顺序来匹配数据的字节顺序。