将具有动态字符串的结构复制到缓冲区 c

Posted

技术标签:

【中文标题】将具有动态字符串的结构复制到缓冲区 c【英文标题】:copy a struct with dynamic strings to a buffer c 【发布时间】:2016-12-03 16:30:26 【问题描述】:

我有这个结构:

typedef struct

   auth_header header; // another struct
   uint8_t action;
   uint8_t priv_lvl;
   uint8_t authen_type;
   uint8_t service;
   uint8_t user_len;
   uint8_t port_len;
   uint8_t rem_addr_len;
   uint8_t data_len;
   char *user;
   char *port;
   char *rem_addr;
   char *data;

 auth_start;

我想创建一个缓冲区并将数据插入其中,以便我可以将此数据发送到我的服务器。

    我不确定缓冲区需要是什么类型 (uint8_t/char/auth_start)。 我不知道我应该怎么做,我应该用 memcpy() 1 逐 1 复制每个字段吗?还是有其他方法?

谢谢! :)

【问题讨论】:

【参考方案1】:

我不确定缓冲区需要是什么类型

任何字节类型都可以。 uint8_t 是个不错的选择,考虑到你的struct 中非指针字段的类型都是uint8_t

我不知道该怎么做,我应该用memcpy()一一复制每个字段

首先,您需要确定缓冲区需要多少内存。您分配该内存,并使用分配复制非指针部分。最后,你memcpy四个指针的数据:

auth_start s = ...
// Add 8 for the initial 8 members
uint8_t *buf = malloc(8+s.user_len+s.port_len+s.rem_addr_len+s.data_len);
uint8_t p = buf;
// Copy the initial fields
*p++ = s.action;
*p++ = s.priv_lvl;
... // And so on for the remaining members
// Copy pointer-based members
memcpy(p, s.user, s.user_len);
p += s.user_len;
memcpy(p, s.port, s.port_len);
p += s.port_len;
... // And so on for the remaining pointer members

【讨论】:

非常感谢!以及如何检查缓冲区是否良好?我需要将 p 重置为 auth 的开头并循环打印? @phantttom 实际指针是 buf,而不是 p。如果要处理下一个结构,请将 p 重置回 buf。

以上是关于将具有动态字符串的结构复制到缓冲区 c的主要内容,如果未能解决你的问题,请参考以下文章

根据缓冲区长度将空终止字符数组复制到 std::string

将字节缓冲区内容复制到结构中

将一种结构复制到另一种结构

将字符串从main复制到结构c

C ++标准是否允许复制任意多态数据结构?

将 C 缓冲区的内容复制到 numpy 数组