检测二进制文件数据的字节顺序
Detect endianness of binary file data
最近我(再次)阅读了有关“endian”的内容。我知道如何识别主机的字节顺序,因为 SO 上有很多 post,而且我也看到了 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
中的数据进行操作,没有对数据进行指针操作或位操作)。
- 我的机器(主机)是小端。
你看不出来。
字节顺序转换本质上是对数字 x
的运算符 E(x),使得 x = E(E(x))。所以你不知道 "which way round" x
元素在你的文件中。
一般来说,"detect" 数据的字节顺序是不可能的。就像不可能检测数据是一个 4 字节整数数组,还是两倍于 2 字节整数的数组。在没有任何关于表示的知识的情况下,原始数据只是一堆无意义的比特。
然而,有了一些关于数据表示的额外知识,这就成为可能了。一些例子:
- 大多数文件格式都要求特定的字节顺序,在这种情况下这绝不是问题。
- Unicode 文本文件可以选择以 byte order mark 开头。同样的想法可以通过其他数据表示来实现。
- 一些文件格式包含 checksum。您可以猜测一种字节序,如果校验和不匹配,请使用另一种字节序再试一次。校验和不太可能与错误的数据解释匹配。
- 有时候你可以根据数据进行猜测。温度超出
33'554'432
度,还是 2
?您可以选择代表合理数据的字节顺序。当然,当外星人入侵并开始融化我们的星球时,这种猜测惨遭失败。
最近我(再次)阅读了有关“endian”的内容。我知道如何识别主机的字节顺序,因为 SO 上有很多 post,而且我也看到了 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
中的数据进行操作,没有对数据进行指针操作或位操作)。 - 我的机器(主机)是小端。
你看不出来。
字节顺序转换本质上是对数字 x
的运算符 E(x),使得 x = E(E(x))。所以你不知道 "which way round" x
元素在你的文件中。
一般来说,"detect" 数据的字节顺序是不可能的。就像不可能检测数据是一个 4 字节整数数组,还是两倍于 2 字节整数的数组。在没有任何关于表示的知识的情况下,原始数据只是一堆无意义的比特。
然而,有了一些关于数据表示的额外知识,这就成为可能了。一些例子:
- 大多数文件格式都要求特定的字节顺序,在这种情况下这绝不是问题。
- Unicode 文本文件可以选择以 byte order mark 开头。同样的想法可以通过其他数据表示来实现。
- 一些文件格式包含 checksum。您可以猜测一种字节序,如果校验和不匹配,请使用另一种字节序再试一次。校验和不太可能与错误的数据解释匹配。
- 有时候你可以根据数据进行猜测。温度超出
33'554'432
度,还是2
?您可以选择代表合理数据的字节顺序。当然,当外星人入侵并开始融化我们的星球时,这种猜测惨遭失败。