在不知道结构的情况下将字符串拆分为结构
split string into struct without knowing structure
我有 8 个字节的带标志的字符串,其中一些是布尔值,一些是字符。我想要的是在我的代码中访问它的名称标记,比如 myStruct.value1
我根据自己的意愿创建了一些结构。我希望我可以将字符串拆分为该结构,因为它们的总大小均为 64 位。
// destination
typedef struct myStruct_t {
uint8_t value1 : 8;
uint8_t value2 : 8;
uint16_t value3 : 16;
uint8_t value4 : 8;
uint8_t value5 : 1;
uint8_t value6 : 1;
uint8_t value7 : 1;
uint8_t value8 : 1;
uint8_t value9 : 1;
uint16_t value10 : 11;
uint8_t value11 : 8;
} myStruct_t;
// source
char buf[8] = "12345678";
// read about strcpy and memcpy but doesn't work
memcpy(myStruct, buf, 8);
但是它不起作用,我收到以下错误消息:
error: cannot convert 'myStruct_t' to 'void*' for argument '1' to 'void* memcpy(void*, const void*, size_t)'
memcpy(myStruct, buf, 8);
^
如果我理解正确,我会先将 8 字符缓冲区转换为二进制。然后,您可以从中提取您想要的每个值的长度的子字符串。最后,您可以将二进制字符串转换为它们的数值。
此外,您应该将 char 数组的大小设置为 9。空终止符需要一个额外的字符。您目前使用的方式无法编译。
memcpy
期望它的前两个参数是指针。
像您的 buf
这样的数组将隐式衰减为指针,但您的类型 myStruct_t
不会。
myStruct_t myStruct;
memcpy(&myStruct, buf, 8);
// ^ produces a POINTER to myStruct
我有 8 个字节的带标志的字符串,其中一些是布尔值,一些是字符。我想要的是在我的代码中访问它的名称标记,比如 myStruct.value1
我根据自己的意愿创建了一些结构。我希望我可以将字符串拆分为该结构,因为它们的总大小均为 64 位。
// destination
typedef struct myStruct_t {
uint8_t value1 : 8;
uint8_t value2 : 8;
uint16_t value3 : 16;
uint8_t value4 : 8;
uint8_t value5 : 1;
uint8_t value6 : 1;
uint8_t value7 : 1;
uint8_t value8 : 1;
uint8_t value9 : 1;
uint16_t value10 : 11;
uint8_t value11 : 8;
} myStruct_t;
// source
char buf[8] = "12345678";
// read about strcpy and memcpy but doesn't work
memcpy(myStruct, buf, 8);
但是它不起作用,我收到以下错误消息:
error: cannot convert 'myStruct_t' to 'void*' for argument '1' to 'void* memcpy(void*, const void*, size_t)'
memcpy(myStruct, buf, 8);
^
如果我理解正确,我会先将 8 字符缓冲区转换为二进制。然后,您可以从中提取您想要的每个值的长度的子字符串。最后,您可以将二进制字符串转换为它们的数值。
此外,您应该将 char 数组的大小设置为 9。空终止符需要一个额外的字符。您目前使用的方式无法编译。
memcpy
期望它的前两个参数是指针。
像您的 buf
这样的数组将隐式衰减为指针,但您的类型 myStruct_t
不会。
myStruct_t myStruct;
memcpy(&myStruct, buf, 8);
// ^ produces a POINTER to myStruct