我最近了解了字节序,但仍然难以确定问题区域。

这是使用从二进制文件(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){
    ...
}

最佳答案

一般而言,字节序仅在您的数据通过某个物理接口(interface)(例如,通过网络或文件)传输时才重要,而这些物理接口(interface)可能源自具有不同本地字节序的平台。如果您尝试通过指针强制转换(例如)执行“巧妙”的事情,也会发生这种情况。 int a = 0xABCD; char b = *(char *)&a;

从您的示例中尚不清楚原始数据来自何处,但我认为已从文件或某处读取了原始数据。确实,处理字节序转换的最佳位置是尽可能靠近接口(interface),因此,在您的情况下,将是读取文件并填充结构的例程。通常,这可以通过预处理器#ifdefs解决,例如在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

等等。

如果您将转换隔离到接口(interface)例程,则其余代码将变为与字节序无关。

关于c++ - 识别与字节序相关的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3549101/

10-09 01:11