c++ - 序列化哪里出错了?

标签 c++ string serialization

<分区>

    void  insert_into_stream(std::ostream& stream,  int number)
{
    int length = sizeof(int);
    char insert_buffer[sizeof(int)];
    memcpy(insert_buffer, &number, length);
    stream.write(insert_buffer, length);
}

int int_from_string(std::string string)
{
    int a; 
    std::istringstream(string)>>a;
    return a;
}

这段代码以前可以工作,我不记得我做了什么细微的改变,它不再工作了。 当输入数字(例如 8001)时,我正在最后一条语句之前进行调试,insert_buffer 包含“A”,所以很明显出了问题,第二个函数没有检索到 8001。

注意 - 在将流发送到第二个函数之前,我确实将流转换为字符串。

第一个函数哪里错了?

---编辑----

是的,我错了,第一个功能实际上在做它应该做的事情,第二个是错误的,谁能解决这个问题?

最佳答案

这两个函数在做完全不同的事情。

第一个函数是将整数的原始二进制表示写入流。

您刚刚复制了位,如果您要序列化为二进制文件,这是正确的做法。

要将其转换回来,您必须读入这 4 个字节,并将其转换为一个整数,就像您正在做相反的事情一样。

当然,当您检查字符时,它们将是整数位的单字节 ascii 表示。所以“A”在那里是一个完全合理的东西,就像其他任何东西一样,因为它完全没有意义。

然而,第二个功能是将 ASCII 数字转换为整数。即 atoi。这对于您尝试执行的操作毫无意义,因为字符不是 ascii 数字,它们是二进制整数。

为编辑而编辑:您想要这样的东西,与您在上面所做的正好相反。

int int_from_string(const char* number)
{
    int a; 
    memcpy(&a, number, sizeof(int));
    return a;
}

关于c++ - 序列化哪里出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17678172/

相关文章:

Java toString 方法 - 打印不正确

Django REST Framework——多重嵌套序列化可能吗?

c# - 使用 JSON.net 处理(反)序列化主数据

c++ - Qt5 C++ 链接新窗口与 Qt Designer

c++ - 从对象C++中的文件读取内容时发生段错误

c++ - 使用 Restbed 时出现链接器错误

java - Lambda和方法引用在运行时级别之间有什么区别?

c++ - 抽象函数参数格式及其对性能的影响?

c - 如何在C中连接宏

javascript - 包含带双引号的字符串的 php 和 javascript 警报