【问题标题】:buffer to struct conversion缓冲区到结构的转换
【发布时间】:2016-11-02 17:47:16
【问题描述】:

我正在尝试将字符串转换为结构。第一个字段中的结构存储第二个字段中存在的字符数。 请让我知道我在这个程序中缺少什么。 我得到错误的输出(一些大整数值)

更新:这个程序可以更正打印 4 (nsize) 吗?

#include <iostream>
using namespace std;

struct SData
{
    int nsize;
    char* str;
};

void main()
{
    void* buffer = "4ABCD";

    SData *obj = reinterpret_cast< SData*>(buffer);

    cout<<obj->nsize;
}

【问题讨论】:

  • 看起来您正在尝试实现自己的字符串类。你可以看看std::string,看看他们是如何从指向string的指针做的。
  • 你希望看到什么?
  • 字符'4'与整数4不同。没有大小,也没有代表性。
  • 如4 所述,字符和整数 4 的大小和值不同。此外,即使您考虑了这一点,编译器也可以填充您的结构,以便相邻数据成员之间有空间......所以没有可预测的方式来做您想做的事情。至少不是您尝试这样做的方式。
  • 如何实现打印4(nsize),谁能指导一下?

标签: c++ serialization struct


【解决方案1】:

你的方法是完全错误的。首先整数的二进制表示取决于平台,即int 的sizeof 和硬件的字节序。其次,您将无法以这种方式填充char 指针,因此您需要创建一些根据格式读取字节的编组代码,将它们转换为int,然后分配内存并将其余部分复制到那里。将内存块转换为结构的简单方法不适用于此结构。

【讨论】:

    【解决方案2】:

    在 SData 对象中,一个整数占用四个字节。您的缓冲区使用一个字节。此外,字符“4”不同于整数 4 的二进制形式。

    【讨论】:

    • 尽管如此,它是正确的,尽管没有人需要解释他们的投票,但你投反对票和走开并不是在帮任何人。
    【解决方案3】:

    如果您想对一段数据进行 ASCII 表示,那么,是的,您需要进行序列化。这不仅仅是希望您认为的结构内容的人类可读版本可以简单地转换为该数据。您必须选择一种序列化格式,然后编写代码或使用现有库。

    热门选择:

    • xml
    • json
    • yaml

    我会使用 json - google 的“c++ json 库”

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多