如何将字节数组转换为“安全字节序”的整数类型(int,long,short等)?

索菲亚
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字节序?

Wolfram77

必须知道字节序或源数据通过网络传输数据时,数据通常 大端的然后,您需要确定您的系统小端还是大端机器。如果的字节序数据系统一样的,只是反转字节,然后使用它。

您可以确定字节顺序您的系统如下:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章