如何将字节数组转换为整数类型(int、long、short等)'endian safely'?
How to convert byte array to integral types (int, long, short, etc.) 'endian safely'?
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 字节序?
不用你管。除非你的 rawData
来自不同的系统(网络流,外设,...)。当您开发游戏引擎时,我认为情况并非如此。
是的,你可以做一些扭曲的事情,比如逐字节写入数据,然后将它们作为整数读取,但这是一个设计问题。你应该避免这种情况,而不是花太多时间担心字节顺序。
您必须知道字节顺序或源数据。当通过 网络 传输时,数据通常 big-endian。然后你需要确定你的 system 是 little-endian 还是 big-endian 机器。如果 data 和 system 的字节序 not 相同,只是 反转 字节,然后使用它。
您可以确定 系统 的 endianness,如下所示:
int is_little_endian() {
short a = 1;
return *((char*)&a) & 1;
}
使用这些宏从 little/big 字节序 转换为 系统字节序,反之亦然:
#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 更深入地了解字节序。
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 字节序?
不用你管。除非你的 rawData
来自不同的系统(网络流,外设,...)。当您开发游戏引擎时,我认为情况并非如此。
是的,你可以做一些扭曲的事情,比如逐字节写入数据,然后将它们作为整数读取,但这是一个设计问题。你应该避免这种情况,而不是花太多时间担心字节顺序。
您必须知道字节顺序或源数据。当通过 网络 传输时,数据通常 big-endian。然后你需要确定你的 system 是 little-endian 还是 big-endian 机器。如果 data 和 system 的字节序 not 相同,只是 反转 字节,然后使用它。
您可以确定 系统 的 endianness,如下所示:
int is_little_endian() {
short a = 1;
return *((char*)&a) & 1;
}
使用这些宏从 little/big 字节序 转换为 系统字节序,反之亦然:
#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 更深入地了解字节序。