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() 没有填充的结构,但代价是访问结构本身的成员速度较慢。这样做只有两个充分的理由:

  1. 结构的对齐和填充由您无法控制的力量决定(必须匹配硬件或第 3 方软件)。
  2. 作为将数据转换为主机格式的中间步骤。