首页 > 解决方案 > 剥离 Buffer 数据的指针数组 (Scatter Gather List) 的前 10 个字节和后 10 个字节

问题描述

我需要执行压缩操作,需要先剥离和最后 10 个字节的用户数据,然后对剩余的用户缓冲区数据进行编程以进行压缩。Array/SGL 可以有多个缓冲区和不同的数据长度。现在可以安全地假设总体用户数据大小大于 1000 字节。

如果有单个用户缓冲区数组,我能够获得正确的逻辑和功能。但是,对于多个缓冲区数组,我们可能必须在编程压缩之前迭代缓冲区并修改data_addr 和 data_len以及整体num_src值,以便剥离前 10 个字节和后 10 个字节,这就是我卡住的地方。非常感谢任何指向博客/代码帮助的建议/指针。

// Buffer data structure
typedef struct
{
  void *data_addr;
  int  data_len; 
}T_BUF_DATA;

//data_len is the length of the data pointed by data_addr;

*int strip_header_in_user_data ( T_BUF_DATA *src, int num_src )
{


    // Strip the first 10 byes

    // single source data
    if ( num_src == 1 )
    {
       src[0].buf_addr = src[0].buf_addr +10;      // increase the offset by 10
       src[0].buf_len = src[0].buf_len -10 - 10 ; // first 10 and last 10 bytes are subtracted
       program_compression ( src, num_src ); 
    }

      // Multiple source buffers
      for ( int i = 0; i < num_src; i++ )
      {
         // Any suggestions here
         program_compression ( ??, ?? );
       }

}*


void program_compression ( T_BUF_DATA *src, int num_src )
{
}

标签: c

解决方案


如果我理解问题(bytes要剥离的字节):

typedef struct
{
  void *data_addr;
  size_t  data_len; 
}T_BUF_DATA;


void strip(T_BUF_DATA *buff, size_t bytes)
{
    unsigned char *data  = buff -> data_addr;
    memmove(buff -> data_addr, data + bytes, buff -> data_len - 2 * bytes);
    buff -> data_len -= 2 * bytes;
}

或去除大小为 nsize 的 n 个元素

void strip(T_BUF_DATA *buff, size_t nelem, size_t nsize)
{
    unsigned char *data  = buff -> data_addr;
    memmove(buff -> data_addr, data + nelem * nsize, buff -> data_len * nsize - 2 * nelem * nsize);
    buff -> data_len -= 2 * nelem;
}

编辑

如果您的问题是如何在这些结构的数组上使用它:

void stripWholeArray(T_BUF_DATA *buff, size_t nbuffers, size_t nbytes)
{
    while(nbuffers--)
    {
        strip(buff++, nbytes);
    }
}

推荐阅读