检测二进制文件数据的字节顺序

Say*_*Pal 2 c++ endianness file-handling

最近我(再次)读到了关于'endian'ness的内容.我知道如何识别主持人的字节顺序,因为SO上有很多帖子,而且我也看过这个,我认为这是非常好的资源.

但是,我想知道的一件事是如何检测输入二进制文件的字节顺序.例如,我正在读取二进制文件(使用C++),如下所示:

ifstream mydata("mydata.raw", ios::binary);

short value;
char buf[sizeof(short)];
int dataCount = 0;

short myDataMat[DATA_DIMENSION][DATA_DIMENSION];
while (mydata.read(reinterpret_cast<char*>(&buf), sizeof(buf)))
{
    memcpy(&value, buf, sizeof(value));
    myDataMat[dataCount / DATA_DIMENSION][dataCount%DATA_DIMENSION] = value;
    dataCount++;
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何检测字节序mydata.raw,以及字节顺序是否影响该程序.

附加信息:

  • 我只是在myDataMat使用数学运算中操作数据,并且没有对数据执行指针操作或按位操作).
  • 我的机器(主机)是小端.

eer*_*ika 6

通常不可能"检测"数据的字节顺序.就像不可能检测数据是4字节整数的数组,还是2字节整数的两倍.在没有任何关于表示的知识的情况下,原始数据只是大量无意义的位.

但是,通过一些关于数据表示的额外知识,它变得可能.一些例子:

  • 大多数文件格式都要求特定的字节顺序,在这种情况下,这绝不是问题.
  • Unicode文本文件可以选择以字节顺序标记开头.其他数据表示可以实现相同的想法.
  • 某些文件格式包含校验和.您可以猜测一个字节序,如果校验和不匹配,请再次使用另一个字节序.校验和不太可能与错误的数据解释相匹配.
  • 有时您可以根据数据进行猜测.温度是外33'554'432度,还是2?您可以选择代表合理数据的字节顺序.当然,当外星人入侵并开始融化我们的星球时,这种猜测就会失败.


Bat*_*eba 5

你说不出来。

字节序变换本质上是数字上的运算符 E(x),x使得 x = E(E(x))。x因此,您不知道这些元素在文件中的位置。