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 endian?
答案 0 :(得分:0)
您无需关心。除非您的rawData
来自不同的系统(网络流,外围设备......)。当你开发游戏引擎时,我认为情况并非如此。
是的,您可以做一些扭曲的事情,比如逐字节写入数据,然后将它们作为整数读取,但这是一个设计问题。你应该避免这种情况,而不是花费太多时间来担心字节序。
答案 1 :(得分:0)
您必须知道字节顺序或源数据。通过网络传输时,数据通常 big-endian 。然后,您需要确定系统是 little-endian 还是 big-endian 计算机。如果数据和系统的字节顺序不相同,只需反向 字节< / em>,然后使用它。
您可以按如下方式确定系统的字节顺序:
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);
}
This answer可以更深入地了解字节序。