1
  1. 我有几个要转换为缓冲区的结构(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));
    
  2. 这是计算缓冲区总长度的最佳方法吗?

    buffer_len = (sizeof(struct_a) + sizeof(struct_b) + ... )/sizeof(u8);
    

谢谢

4

2 回答 2

1

我认为这u8意味着无符号 8 位。因此,sizeof(u8)等于 1。所以你可以简单地写:

os_memcpy(&buffer[sizeof(struct_a)], &b, sizeof(struct_b));

对于您的第二个问题,除了除以 1 没有用外,这是计算缓冲区 len 的一种非常好的方法。

我不是它的忠实粉丝,buffer + sizeof(struct_a)但它也很好。

编辑:另外,在做那​​种事情时,如果缓冲区元素的大小不是 1,我将缓冲区转换为与u8. 这样,我不必除以缓冲区元素的大小。

于 2013-10-07T17:17:01.237 回答
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
}
于 2013-10-07T17:31:07.103 回答