1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <stdio.h>
#include <string.h>
#pragma pack(1)
typedef struct {
short a;
float b;
} Foo;
typedef struct {
int a;
Foo b;
} SuperFoo;
#pragma pack()
typedef enum {
TypeFoo,
TypeSuperFoo
} Type;
void serialize_and_send(Type type, void* data, size_t length) {
printf("S&S %d %p %lu\n", type, data, length);
// Simulate reception
switch (type) {
case TypeFoo: {
Foo foo;
memcpy(&foo, data, length);
printf("%d %f\n", foo.a, foo.b);
break;
}
case TypeSuperFoo: {
SuperFoo super_foo;
memcpy(&super_foo, data, length);
printf("%d %d %f\n", super_foo.a, super_foo.b.a, super_foo.b.b);
break;
}
default:
puts("Unknown type");
}
}
void serialize_and_send_foo(Foo* foo) {
serialize_and_send(TypeFoo, foo, sizeof(Foo));
}
void serialize_and_send_super_foo(SuperFoo* super_foo) {
serialize_and_send(TypeSuperFoo, super_foo, sizeof(SuperFoo));
}
int main() {
Foo foo = {1, 2.3f};
SuperFoo super_foo = {42, foo};
serialize_and_send_foo(&foo);
serialize_and_send_super_foo(&super_foo);
} |
Partager