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);}。。。。