从二进制文件读取时将big endian转换为little endian

sta*_*orn 18 c++ binaryfiles endianness

我一直在寻找如何将big-endian转换为little-endians.但我找不到任何可以解决我问题的好处.似乎有很多方法可以进行这种转换.无论如何,以下代码在big-endian系统中正常工作.但是我应该如何编写转换函数,以便它也适用于little-endian系统?

这是一个功课,但它只是一个额外的,因为在学校运行大端系统的系统.这只是我很好奇,并希望它也可以在我的家用电脑上工作

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
   ifstream file;

   file.open("file.bin", ios::in | ios::binary);

   if(!file)
      cerr << "Not able to read" << endl;
   else
   {
      cout << "Opened" << endl;

      int i_var;
      double d_var;

      while(!file.eof())
      {
         file.read( reinterpret_cast<char*>(&i_var) , sizeof(int) );
         file.read( reinterpret_cast<char*>(&d_var) , sizeof(double) );
         cout << i_var << " " << d_var << endl;
      }
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

解决了

所以Big-endian VS Little-endian只是字节的逆序.我写的这个功能似乎无论如何都符合我的目的.我在这里添加它以防万一其他人将来需要它.这只是双倍,但是对于整数,要么使用建议的函数torak,要么可以通过使它仅交换4个字节来修改此代码.

double swap(double d)
{
   double a;
   unsigned char *dst = (unsigned char *)&a;
   unsigned char *src = (unsigned char *)&d;

   dst[0] = src[7];
   dst[1] = src[6];
   dst[2] = src[5];
   dst[3] = src[4];
   dst[4] = src[3];
   dst[5] = src[2];
   dst[6] = src[1];
   dst[7] = src[0];

   return a;
}
Run Code Online (Sandbox Code Playgroud)

Din*_*ngo 21

您可以使用模板进行endian交换,该模板将针对数据类型进行推广:

#include <algorithm>

template <class T>
void endswap(T *objp)
{
  unsigned char *memp = reinterpret_cast<unsigned char*>(objp);
  std::reverse(memp, memp + sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)

然后你的代码最终会看起来像:

file.read( reinterpret_cast<char*>(&i_var) , sizeof(int) );
endswap( &i_var );
file.read( reinterpret_cast<char*>(&d_var) , sizeof(double) );  
endswap( &d_var );
cout << i_var << " " << d_var << endl;  
Run Code Online (Sandbox Code Playgroud)


Bry*_*yan 2

假设您要继续,保留一个辅助函数的小库文件会很方便。其中 2 个函数应该是 4 字节值和 2 字节值的字节序交换。有关一些可靠的示例(包括代码),请查看这篇文章

获得交换函数后,每当您以错误的字节序读入值时,请调用适当的交换函数。有时,这里的人们的一个绊脚石是单字节值不需要进行字节序交换,因此,如果您正在读取代表文件中字母字符串的字符流之类的内容,那么应该很好。只有当您读取多个字节的值(如整数值)时,您才必须交换它们。