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

时间:2016-06-17 08:49:04

标签: c++ file-handling endianness

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

但是,我想知道的一件事是如何检测输入二进制文件的字节顺序。例如,我正在阅读二进制文件(使用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++;
}

我想知道如何检测mydata.raw中的字节序,以及字节顺序是否会影响此程序。

其他信息:

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

2 个答案:

答案 0 :(得分:5)

一般来说,无法“检测”数据的字节顺序。就像不可能检测数据是4字节整数的数组,还是2字节整数的两倍。在没有任何关于表示的知识的情况下,原始数据只是一大堆无意义的数据。

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

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

答案 1 :(得分:3)

你无法说出来。

字节顺序变换本质上是数字x上的运算符E(x),使得x = E(E(x))。所以你不知道&#34;哪个方向?#34; x元素位于您的文件中。