c语言中的多态性与缓冲区
我有一个联盟:c语言中的多态性与缓冲区,c,serialization,buffer,unions,binary-serialization,C,Serialization,Buffer,Unions,Binary Serialization,我有一个联盟: typedef union Message { message_base base; message_with_parameters parameters; reply_message reply; buffer_t *buffer; // can't figure out what to put here } message; message\u带有参数的第一个字段是mes
typedef union Message
{
message_base base;
message_with_parameters parameters;
reply_message reply;
buffer_t *buffer; // can't figure out what to put here
} message;
message\u带有参数
的第一个字段是message\u base
,reply\u message
的第一个字段是message\u带有参数
,而第一个字段是message\u base
。因此,基本上我可以访问它们中的任何一个,我仍然可以获得我需要的所有数据,但是我从我的驱动程序获得了一个缓冲区,现在我想将其序列化到消息中。
我已经知道指向缓冲区的指针是错误的,因为它不会与我的结构相关联,但我不能有固定大小的缓冲区。
在这条路上的某个地方,我想这样做:
m->buffer = buff->payload;
而且无论我有什么样的数据类型,它仍然会序列化。怎样才能做到呢 编辑:
以下是我的结构:
typedef struct MessageBase
{
uint32_t u32DeviceID;
uint32_t u32CoreID;
uint16_t u16Class;
uint16_t u16CRC;
uint8_t u8OpCode;
void (*states [MAX_OPCODES]) (void *);
} message_base;
typedef struct MessageWithParameters
{
message_base base_class;
uint8_t u8Param1;
uint8_t u8Param2;
} message_with_parameters;
typedef message_with_parameters reply_message;
typedef union Message
{
message_base base;
message_with_parameters parameters;
reply_message reply;
} message;
这是因为缓冲区中的数据不是联合的一部分 buffer_t*buffer是指针,因此指针是联合的一部分,而不是它所指向的数据 你可能想做一些类似的事情
m = (message*) buff->payload;
我只收到垃圾。即使我输入的值是正确的,也很难知道你在做什么,我只是在猜测。您有一个数据缓冲区,它是一个“消息”,因此您定义了一个消息联合(我对此有点怀疑,我不确定是否所有这些字段都应该是一个联合?或者它是否应该是一个结构,其中一些字段作为联合?)。因此,缓冲区中的数据,第一个字节将是消息库中任何内容的第一个字节,也是reply_消息的第一个字节,也是带有参数的消息_的第一个字节。@Keith Nicholas:有关我的结构,请参阅我的编辑。有效负载的类型是void*,如果您想知道,那么如果您执行m=(message*)buff->payload,那么m->base.u32DeviceID是否合理?我可能会怀疑有效载荷中的数据。然后看看m->basevoid blah(){无符号字符数据[]={1,2,3,4,5,6,7,8};消息*m=(消息*)数据;为我打印“4030201”的printf(“%x\r\n”,m->base.u32DeviceID);}。。。。