c struct 和 memcpy(字节数组)
c struct and memcpy (byte array)
我正在接收字节缓冲区数组并尝试将其复制到一个结构中:
我的结构是:
typedef struct mydata_block
{
uint8_t cmd;
uint32_t param;
char str_buf[10];
uint32_t crc32;
} mydata_t;
首先发送数据的程序如下:
blockTX.cmd = 2
blockTX.str_buf = "eee789"
blockTX.param = 1001
blockTX.crc32 = 3494074521
-
02-00-00-00-E9-03-00-00-65-65-65-37-38-39-00-00-00-00-00-00-99-58-43-D0
当收到数据时,我使用下面的 memcpy 代码将数据复制到结构中:
memcpy((uint8_t *)&blockRX,(uint8_t *)usbd_cdc_buffer,sizeof(blockRX));
一切看起来都很好,但不是 cmd(它是 1 个字节,但有填充?在结构中?)我该如何解决这个问题?
传输数据需要考虑填充、大小、字节顺序等,因此您需要正确生成和解析字节流。您可以使用 googloe protobuf 之类的东西来序列化和反序列化您的数据,既可移植又舒适。
但是如果你必须的话,你可以给结构 packed 属性。这将删除所有填充和对齐限制。这使您可以 memcpy()
没有填充的结构,但代价是访问结构本身的成员速度较慢。这样做只有两个充分的理由:
- 结构的对齐和填充由您无法控制的力量决定(必须匹配硬件或第 3 方软件)。
- 作为将数据转换为主机格式的中间步骤。
我正在接收字节缓冲区数组并尝试将其复制到一个结构中:
我的结构是:
typedef struct mydata_block
{
uint8_t cmd;
uint32_t param;
char str_buf[10];
uint32_t crc32;
} mydata_t;
首先发送数据的程序如下:
blockTX.cmd = 2
blockTX.str_buf = "eee789"
blockTX.param = 1001
blockTX.crc32 = 3494074521
-
02-00-00-00-E9-03-00-00-65-65-65-37-38-39-00-00-00-00-00-00-99-58-43-D0
当收到数据时,我使用下面的 memcpy 代码将数据复制到结构中:
memcpy((uint8_t *)&blockRX,(uint8_t *)usbd_cdc_buffer,sizeof(blockRX));
一切看起来都很好,但不是 cmd(它是 1 个字节,但有填充?在结构中?)我该如何解决这个问题?
传输数据需要考虑填充、大小、字节顺序等,因此您需要正确生成和解析字节流。您可以使用 googloe protobuf 之类的东西来序列化和反序列化您的数据,既可移植又舒适。
但是如果你必须的话,你可以给结构 packed 属性。这将删除所有填充和对齐限制。这使您可以 memcpy()
没有填充的结构,但代价是访问结构本身的成员速度较慢。这样做只有两个充分的理由:
- 结构的对齐和填充由您无法控制的力量决定(必须匹配硬件或第 3 方软件)。
- 作为将数据转换为主机格式的中间步骤。