首页 文章

从文件中反转长读?

提问于
浏览
0

我正在尝试从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

    而不是使用 long ,而是使用 <stdint.h> 中的 int32_t 来直接指定32位整数 . (或 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
    
  • 0

    我建议你使用像htonl,htnons,ntohl和ntohs这样的函数 . 这些用于网络编程以实现同样的目标:可移植性和字节序的独立性 .

  • 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这样的东西,它将为你处理所有的编码问题 .

相关问题