gpt4 book ai didi

c++ - 如何将字节数组转换为整型(int、long、short等) 'endian safely'?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:32 25 4
gpt4 key购买 nike

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

最佳答案

必须知道字节顺序或源数据。通过网络传输时,数据通常 big-endian。然后您需要确定您的系统little-endian 还是big-endian 机器。如果数据系统的字节顺序相同,只需反转字节,然后使用它。

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

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更深入地了解字节顺序。

关于c++ - 如何将字节数组转换为整型(int、long、short等) 'endian safely'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35683931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com