template <class T>
T readData(size_t position)
{
byte rawData[sizeof(T)] = { 0, };
// some logic that write data into rawData
return *((T*)rawData);
}
现在,我正在开发跨平台的游戏引擎。但我听说,由于字节顺序差异,强制转换绝对是危险的。如何在不使用有关字节序的条件的情况下将rawData安全地转换为T字节序?
您必须知道字节序或源数据。通过网络传输数据时,数据通常 是大端的。然后,您需要确定您的系统是小端还是大端机器。如果的字节序数据和系统是不一样的,只是反转的字节,然后使用它。
您可以确定字节顺序您的系统如下:
int is_little_endian() {
short a = 1;
return *((char*)&a) & 1;
}
使用以下宏将Little / Big Endian转换为System Endian,反之亦然:
#define LITTLE_X_SYSTEM(dst_type, src) if(!is_little_endian()) memrev((src), 1 , sizeof(dst))
#define BIG_X_SYSTEM(dst_type, src) if(is_little_endian()) memrev((src), 1, sizeof(dst))
您可以像这样使用它:
template <class T>
T readData(size_t position)
{
byte rawData[sizeof(T)] = { 0, };
// assuming source data is big endian
BIG_X_SYSTEM(T, rawData);
return *((T*)rawData);
}
这个答案使人们对字节序有了更多的了解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句