撤消文件的长读取?

时间:2016-04-15 04:02:31

标签: c++ long-integer ifstream endianness

我试图用C ++中的二进制文件读取一个长的(有符号的,4个字节)。 我主要担心的是:可移植性(不同平台上的longs是不同的大小),当你从二进制文件中读取w / std :: ifstream时,它会颠倒字节顺序(到我的机器的字节顺序)。

我理解像unsigned int这样的数据类型,你可以简单地使用按位运算符,并从文件读取后移位和AND每个字节以反转字节顺序。

我只是不确定我为此做了什么: 目前我的代码将给出一个无意义的值:

long value;
in.seekg(0x3c);
in.read(reinterpret_cast<char*>(&value), sizeof(long));

我不确定如何实现可移植性(我读了一些关于联合和char *的内容)并且还反转了它所读取的签名长度。

感谢。

3 个答案:

答案 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