将结构复制到char *缓冲区

时间:2016-03-07 09:18:39

标签: c pointers structure memcpy

基本上我有一个包含不同类型数据的自定义结构。例如:

typedef struct example_structure{
uint8_t* example_1[4];
int example_2[4];
int example_3;
} example_structure;

我需要做的是将此结构的上下文复制到const char* buffer,以便我可以使用winsock2的buffer函数发送复制的数据(send(SOCKET s, const char* buffer, int len, int flags))。我尝试使用memcpy(),但我不会只是复制指针的地址而不是数据吗?

4 个答案:

答案 0 :(得分:1)

是的,如果您通过套接字复制或发送该结构,则最终会复制/发送指针,但这对收件人来说显然毫无意义,但是,如果收件人在不同的硬件上运行(例如,不是相同的端) ,无论如何,所有数据都可能毫无意义。最重要的是,结构成员之间填充量的差异也可能成为一个问题。

对于非平凡的情况,最好使用现有协议(例如protobuf),或推出自己的协议,同时牢记数据硬件表示的潜在差异。

答案 1 :(得分:0)

您需要先设计一个协议,然后才能根据该协议对数据进行编码。确切地确定如何在字节级别对数据进行编码。然后编写代码以对您决定的格式进行编码和解码。

不要跳过在字节级实际记录有线协议的步骤。我保证,它会在以后拯救你。

有关详细信息,请参阅this answer

答案 2 :(得分:0)

const char* buffer

此缓冲区具有常量值,因此您无法复制任何内容。你可能不需要复制任何东西。只需以这种方式使用send功能:

send(s, (char*)&example_structure, sizeof(structure), flags)

但是结构中的指针存在问题(uint8_t* example_1[4];)。 在不同的应用程序/机器之间发送指针是没有意义的。

答案 3 :(得分:0)

嗯,你的结构包含uint8_t *个字段,看起来像C字符串...复制或发送指针没有意义,这只是发送过程中的一个内存地址用户空间。

如果你的结构已经(注意,没有指针):

typedef struct example_structure{
uint8_t example_1[4];
int example_2[4];
int example_3;
} example_structure;

如果你在完全相同的架构(相同的硬件,相同的编译器,相同的编译器选项)上传输它,你可以做到:

example_structure ex_struc;
// initialize the struct
...
send(s, &ex_struc, sizeof(ex_struc), flags);

即使在这种情况下,我强烈建议您定义和使用协议 - 正如@DavidSchwartz已经说过的那样,它可以为您节省时间和麻烦......

但是,正如你有指针,你不能这样做,必须定义一个协议。

它可能是(但您可以自由地优先使用小端序,或者每个int使用2或8个字节,具体取决于您的实际数据):

  • 一个字节(或两个)表示第一个uint8_t数组的长度,后跟数组
  • 以上重复3次
  • example_2的第一个int的大端顺序的四个字节
  • 重复3次
  • 以big endian顺序的四个字节,用于example_3
  • 的int

这清楚地定义了消息的格式。