如何将字节数组转换为整数类型(int,long,short等)' endian安全'?

时间:2016-02-28 14:46:53

标签: c++ casting endianness

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?

2 个答案:

答案 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可以更深入地了解字节序。