我试图用C ++中的二进制文件读取一个长的(有符号的,4个字节)。 我主要担心的是:可移植性(不同平台上的longs是不同的大小),当你从二进制文件中读取w / std :: ifstream时,它会颠倒字节顺序(到我的机器的字节顺序)。
我理解像unsigned int这样的数据类型,你可以简单地使用按位运算符,并从文件读取后移位和AND每个字节以反转字节顺序。
我只是不确定我为此做了什么: 目前我的代码将给出一个无意义的值:
long value;
in.seekg(0x3c);
in.read(reinterpret_cast<char*>(&value), sizeof(long));
我不确定如何实现可移植性(我读了一些关于联合和char *的内容)并且还反转了它所读取的签名长度。
感谢。
答案 0 :(得分:0)
我建议你使用像htonl,htnons,ntohl和ntohs这样的函数。这些用于网络编程以实现同样的目标:可移植性和字节序的独立性。
答案 1 :(得分:0)
由于跨平台支持对您很重要,我建议您使用cstdint来指定类型的大小。您可以说int32_t x
(例如),并且知道您获得了32位数据。
关于数据的字节顺序,我建议对格式进行标准化(例如,所有数据都以小端格式编写),并将I / O操作包装在一个类中,并使用它来读/写数据。然后使用#define
来决定如何读取数据:
#ifdef BIG_ENDIAN
// Read the data that is in little endian format and convert
#else
// We're in little endian mode so no need to convert data
#endif
或者您可以使用Google Protobuf之类的内容来处理所有编码问题。
答案 2 :(得分:0)
使用long
中的int32_t
来直接指定32位整数,而不是使用<stdint.h>
。 (或uint32_t
表示无符号)。
根据需要使用htonl and ntohl来获取/来自网络字节顺序。
更好:
int32_t value;
in.seekg(0x3c);
in.read(reinterpret_cast<char*>(&value), sizeof(value));
value = ntohl(value); // convert from big endian to native endian