我有几个结构(u8字段)我想转换成缓冲区,这是最好的方法吗?
struct struct_a a;
struct struct_b b;
u8 buffer[64];
u8 *next_pos;
os_memcpy(buffer, &a, sizeof(struct_a));
next_pos = buffer + sizeof(struct_a)/sizeof(u8);
os_memcpy(next_pos, &b, sizeof(struct_b));
这是计算缓冲区总长度的最佳方法吗?
buffer_len = (sizeof(struct_a) + sizeof(struct_b) + ... )/sizeof(u8);
由于
答案 0 :(得分:1)
我假设u8
表示无符号8位。因此,sizeof(u8)
等于1.所以你可以简单地写:
os_memcpy(&buffer[sizeof(struct_a)], &b, sizeof(struct_b));
对于你的第二个问题,除了除以1是没用的,它是计算缓冲区len的一种非常好的方法。
我不是buffer + sizeof(struct_a)
的忠实粉丝,但它也很好。
编辑:此外,在执行此类操作时,如果缓冲区元素的大小不是1,我会将缓冲区转换为等效于u8
的内容。这样,我不必除以缓冲区元素的大小。
答案 1 :(得分:0)
以这种方式定义缓冲区,
#define MAXBUF (999)
type struct
{
int size; //or short, or char, or long long, depending on size...
char buffer[MAXBUF];
} buffer_t;
或者,这样,并分配足够的空间(足够的空间定义为你需要多少),
#define MAXBUF (999)
type struct
{
int size;
char buffer[MAXBUF];
} buffer_t;
然后是一个向缓冲区添加内容的函数,
int
buffer_add(buffer_t* buffer,void* thing,int len)
{
if(!thing) return 0;
if(len<1) return 0;
memcpy( &(buffer[buffer->size]),thing,len);
return(buffer->size+=len);
}
现在,使用它很容易,
typedef char u8;
struct struct_a { u8 x[100]; };
struct struct_b { int y[25]; };
int main()
{
u8 buffer[64];
u8 *next_pos;
buffer_t mybuffer;
buffer_add(&mybuffer,&a,sizeof(a));
buffer_add(&mybuffer,&b,sizeof(b));
buffer_add(&mybuffer,&buffer,sizeof(buffer));
buffer_add(&mybuffer,next_pos,sizeof(*next_pos));
//do stuff with mybuffer
}