C++相关reinterpret_cast的使用
C++有关reinterpret_cast的使用
最近在维护一段公司的老代码,有一个函数式用来将某一个数据类型(uint8, uint16, float, int32,etc)转换成uin8的字节流的,函数大概如下:
typedef const UInt8 *ConstUInt8Array;
m_ElementValue是个泛型的成员变量
T m_ElementValue;
virtual bool ToByteStream(ConstUInt8Array *pValue, int *pSize)
{
*pValue = reinterpret_cast<ConstUInt8Array>(&m_ElementValue);
*pSize = sizeof(m_ElementValue);
}
这样的写法对不对的?这样直接进行强制类型转换的话,比uint8长的数据不是会丢失多的那一部分数据吗?
如果确实有问题的话能否给个大致的方案?(注意这个函数要支持各种类型数据的转换)
------解决思路----------------------
virtual bool ToByteStream(ConstUInt8Array *pValue, int *pSize)
{
*pValue = reinterpret_cast<ConstUInt8Array>(&m_ElementValue);//这里是将一个地指转换成uint8.如果你的系统地址长度就是uint8的话,完全没有问题,不管什么的泛型,反正地址都是一样大小的
*pSize = sizeof(m_ElementValue);
}
------解决思路----------------------
这代码本身没啥问题。长度在*pSize里所以没有丢失数据。用的时候别乱用就是。
------解决思路----------------------
他是把任何数据转换成其在内存的布局的字节序。
她基本支持一般类型和自定义结构,但是 指针除外。
------解决思路----------------------
需要先序列化 iLength. 这个和普通保存 iLength 一致。然后在序列化长度为 iLength 的数据。
反序列化的时候,就可以先获取到长度,然后根据这个长度获取到指定长度的数据。
然后,和 ToStream 类似的函数,直接把这个长度的内存转换为类型数据。
------解决思路----------------------
uint16 *iUInt16Array;
iUInt16Array = reinterpret_cast<uint8 *>(&m_data[0]);
把指针类型弄成一样的,然后再试试。
还有,你这个转换的两端,字节序是一样的吗?
最近在维护一段公司的老代码,有一个函数式用来将某一个数据类型(uint8, uint16, float, int32,etc)转换成uin8的字节流的,函数大概如下:
typedef const UInt8 *ConstUInt8Array;
m_ElementValue是个泛型的成员变量
T m_ElementValue;
virtual bool ToByteStream(ConstUInt8Array *pValue, int *pSize)
{
*pValue = reinterpret_cast<ConstUInt8Array>(&m_ElementValue);
*pSize = sizeof(m_ElementValue);
}
这样的写法对不对的?这样直接进行强制类型转换的话,比uint8长的数据不是会丢失多的那一部分数据吗?
如果确实有问题的话能否给个大致的方案?(注意这个函数要支持各种类型数据的转换)
------解决思路----------------------
virtual bool ToByteStream(ConstUInt8Array *pValue, int *pSize)
{
*pValue = reinterpret_cast<ConstUInt8Array>(&m_ElementValue);//这里是将一个地指转换成uint8.如果你的系统地址长度就是uint8的话,完全没有问题,不管什么的泛型,反正地址都是一样大小的
*pSize = sizeof(m_ElementValue);
}
------解决思路----------------------
这代码本身没啥问题。长度在*pSize里所以没有丢失数据。用的时候别乱用就是。
------解决思路----------------------
他是把任何数据转换成其在内存的布局的字节序。
她基本支持一般类型和自定义结构,但是 指针除外。
------解决思路----------------------
需要先序列化 iLength. 这个和普通保存 iLength 一致。然后在序列化长度为 iLength 的数据。
反序列化的时候,就可以先获取到长度,然后根据这个长度获取到指定长度的数据。
然后,和 ToStream 类似的函数,直接把这个长度的内存转换为类型数据。
virtual void ToByteStream(ConstUInt8Array *pValue, int *pSize)
{
*pValue = reinterpret_cast<ConstUInt8Array>(&m_ElementValue);
*pSize = sizeof(m_ElementValue);
}
virtual T ToByteStream(ConstUInt8Array *pValue, int Size)
{
_assert(Size = sizeof (T));
return *reinterpret_cast<T const *>(pValue);
}
------解决思路----------------------
uint16 *iUInt16Array;
iUInt16Array = reinterpret_cast<uint8 *>(&m_data[0]);
把指针类型弄成一样的,然后再试试。
还有,你这个转换的两端,字节序是一样的吗?