我正在尝试从文件中读取一些字节。
这就是我所做的:
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 06
,header->format[0]
将是00
和header->format[1]
06
。这两个数字的组合代表数字0x0006
,即十进制的6
,这是期望的值。
当我做
之类的事情时*reinterpret_cast<unsigned*>(header->format) // In this case, the result is 0x0600
错误地返回数字0x0600
,因此它似乎反转读取字节数。
我的问题是将数字正确读取为无符号的一些解决方法。
答案 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]
。不要依赖处理器的字节顺序来匹配数据的字节顺序。