识别与endian相关的问题

时间:2010-08-23 15:35:40

标签: c++ c endianness

我最近了解了字节序,但仍难以识别问题区域。

这是一段使用从二进制文件(Dxt纹理)加载的数据的代码片段。我不确定字节顺序是否会在这种情况下引起问题,例如宽度,高度和十六进制比较。我需要改变什么以及为什么?

DxtHeader* header = (DxtHeader*)data;
width = header->width;
height = header->height;

uint pixelFormat = header->pixelFormat.fourCC;
if (pixelFormat == 0x31545844){
    ...
} else if (pixelFormat == 0x33545844){
    ...
} else if (pixelFormat == 0x35545844){
    ...
}

2 个答案:

答案 0 :(得分:1)

一般来说,只有当您的数据通过某个物理接口(例如,通过网络或文件)传播时,字节顺序才有意义,它可能源自具有不同本机字节序的平台。如果你试图用指针转换做“聪明”的事情,例如,也会发生这种情况。 int a = 0xABCD; char b = *(char *)&a;

从您的示例中不清楚原始数据的来源,但我认为它是从文件或某处读取的。实际上,处理字节序转换的最佳位置是尽可能接近接口,因此在您的情况下,读取文件并填充结构的例程。通常,这可以通过预处理器#ifdef来解决,例如,在C中(我知道这是一个C ++问题,但我相信你能找到一个合适的等价物):

#ifdef (LITTLE_ENDIAN)
#define FILE_TO_NATIVE_16(x)  ((((x) & 0xFF) << 8) | ((x) >> 8))
#else
#define FILE_TO_NATIVE_16(x)  (x)
#endif

等等。

如果将转换隔离到接口例程,则其余代码将变为与endian无关。

答案 1 :(得分:1)

最好将数据保存在适合目标平台的第一位。即当您创建数据文件时,endian会交换所有字段。

除此之外,我认为您的DXT加载程序应该自动处理这个问题,因为DXT通常会在Windows机器上构建,这些机器目前都是小端的。