gpt4 book ai didi

c++ - 将一些数据写入 Char

转载 作者:太空宇宙 更新时间:2023-11-04 12:12:22 26 4
gpt4 key购买 nike

一些网络问题。我偶然发现了这个问题:Serialization/Deserialization of a struct to a char* in C许多答案都是有道理的,但我一遍又一遍地看到的是所有数据包似乎都携带的“字符数据”字段。

现在我知道它的用途了——您可以将要发送的数据存储在这里。但是实际上如何向其中写入数据呢?有没有办法将整个对象存储在这个数据字段中?或者我是否以某种方式序列化对象,将其存储在数据中,然后在发送所有内容之前序列化数据包......?

最佳答案

每个变量都存在于您计算机的内存中。内存以字节为单位组织。

当您编写 C++ 代码时,您可以直接读取这些字节。对于一个结构,其所有成员的内存都在一个连续的 block 中(尽管每个成员之间可能存在间隙)。

所以,如果我声明:

struct foo {
char x;
char y;
short z;
int q;
};

然后当我创建一个 struct foo 时,我在内存中得到以下布局(在大多数系统上总共 8 个字节):

 xyzzqqqq

第一个字节是x,第二个是y,第三个和第四个是z,最后四个是 q.

因此,该对象已经“序列化”了——您有一堆字节来表示它。这就是您需要通过网络发送的全部内容:表示数据结构的信息。

您编写自己的序列化程序的原因是因为您可能希望更改读取或写入对象的方式(例如,如果我向 struct 添加一个字段会怎么样foo?),因为你需要在内存布局不同的机器之间进行通信(z 的哪个字节代表数字的“最重要”部分?),或者因为你只想要序列化结构的一部分(如果我们在成员之间有一些空白怎么办?)。

但是,从根本上说,您发送“字符数据”的原因是因为您计算机中的所有内容都可以用这种方式表示。我不会讨论图灵关于符号编码的证明,但这是一种数学上的确定性,即任何知识都可以编码为一系列 1 和 0。

更具体地说,将数据放入数据包的“字符数据”字段的方法是通过memcpying 从数据当前所在的位置进入缓冲区。因此,如果我有一个 char* 目标,我可以将一个 struct foo x 写入其中:

memcpy(target, &x, sizeof(struct foo));

或者我可以通过编写每个字段来更仔细地做到这一点:

memcpy(target, &x.x, 1);
memcpy(target+1, &x.y, 1);
memcpy(target+2, &x.z, sizeof(short));
memcpy(target+4, &x.q, sizeof(int));

& 是寻址运算符,如果您还不知道的话。所以我从每个成员的地址写入 target 中的某个偏移量,并写入与成员变量表示的长度相等的字节数。

您最后一个问题的公认答案指出,这是一个过于简单化的问题:当您通过网络发送多字节整数时,您必须担心字节顺序(字节顺序)。所以你实际做的是这样的:

memcpy(target, &x.x, 1);
memcpy(target+1, &x.y, 1);
*((short*)(target+2)) = htons(x.z);
*((int*)(target+4)) = htonl(x.q);

这将根据需要处理反转字节以从主机字节顺序转换为网络字节顺序。显然,一个字节长的值是免疫的。

关于c++ - 将一些数据写入 Char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com