C++ 正确序列化/取消序列化基本体,并考虑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

对于一个项目,我尝试序列化一些原语,并通过连接将它们发送到本地托管的Java服务器。java部分现在并不重要,但重要的是java将其数据解释为大字节,而C++程序是Little Endian。 举个小例子,我有一个双:

_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];
}