C++ 正确序列化/取消序列化基本体,并考虑Endian
对于一个项目,我尝试序列化一些原语,并通过连接将它们发送到本地托管的Java服务器。java部分现在并不重要,但重要的是java将其数据解释为大字节,而C++程序是Little Endian。 举个小例子,我有一个双:C++ 正确序列化/取消序列化基本体,并考虑Endian,c++,serialization,C++,Serialization,对于一个项目,我尝试序列化一些原语,并通过连接将它们发送到本地托管的Java服务器。java部分现在并不重要,但重要的是java将其数据解释为大字节,而C++程序是Little Endian。 举个小例子,我有一个双: _fields.degLatitude = 50.0; 然后我想序列化该数据,但还要交换字节顺序(以符合Little->Big-Endian): char缓冲区[sizeof(结构字段)]; char*p=缓冲区; writeReversedData(&p,_fields.de
_fields.degLatitude = 50.0;
然后我想序列化该数据,但还要交换字节顺序(以符合Little->Big-Endian):
char缓冲区[sizeof(结构字段)];
char*p=缓冲区;
writeReversedData(&p,_fields.degLatitude);
writeReversedData的实现如下:
template <typename T> void JsbSimWrapper::writeReversedData(char** bb, T& data)
{
const char* charBuffer = std::to_string(data).c_str();
for (int i = 0; i < sizeof(T); i++)
{
(*bb)[i] = charBuffer[sizeof(T) - i - 1];
}
*bb += sizeof(T);
}
template void JsbSimWrapper::writeReversedData(char**bb,T&data)
{
const char*charBuffer=std::to_string(data).c_str();
对于(int i=0;i
然后,作为对我的一个测试,我想取消序列化该数据,然后将其交换回Little Endian:
std::cout << getReversedData<double>(&p) << std::endl;
std::cout此代码存储指向临时文件的指针。一旦语句完成,它就会悬空
const char* charBuffer = std::to_string(data).c_str();
另外,在for循环中
for (int i = 0; i < sizeof(T); i++)
{
(*bb)[i] = charBuffer[sizeof(T) - i - 1];
}
for(inti=0;i
没有规则规定字符串表示形式为sizeof(T)
。例如,一个4字节的整数可以转换为10位数字
最好将转换后的结果存储在std::string
中,然后使用该字符串的length()
const char* charBuffer = std::to_string(data).c_str();
for (int i = 0; i < sizeof(T); i++)
{
(*bb)[i] = charBuffer[sizeof(T) - i - 1];
}