C 剥离缓冲区数据指针数组(分散-聚集列表)的第一个和最后10个字节

C 剥离缓冲区数据指针数组(分散-聚集列表)的第一个和最后10个字节,c,C,我需要执行一个压缩操作,需要先剥离最后10个字节的用户数据,然后对剩余的用户缓冲区数据进行压缩编程。阵列/SGL可以有多个缓冲区和不同的数据长度。目前,可以安全地假设总体用户数据大小大于1000字节 如果有单用户缓冲区阵列,我能够获得正确的逻辑和功能。但是,对于多缓冲区阵列,在编程压缩之前,我们可能必须迭代缓冲区,修改数据添加和数据长度以及总体num\u src值,以便剥离前10个字节和最后10个字节,这正是我遇到的问题。非常感谢您对博客/代码帮助的任何建议/指点 // Buffer data

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

如果有单用户缓冲区阵列,我能够获得正确的逻辑和功能。但是,对于多缓冲区阵列,在编程压缩之前,我们可能必须迭代缓冲区,修改数据添加和数据长度以及总体num\u 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 )
{
}
//缓冲区数据结构
类型定义结构
{
void*数据地址;
国际数据中心;
}T_BUF_数据;
//data_len是data_addr所指数据的长度;
*用户数据中的int strip_header_(T_BUF_data*src,int num_src)
{
//取消前10个“是”
//单源数据
如果(num_src==1)
{
src[0]。buf_addr=src[0]。buf_addr+10;//将偏移量增加10
src[0].buf_len=src[0].buf_len-10-10;//减去前10个字节和后10个字节
程序压缩(src,num\u src);
}
//多个源缓冲区
对于(int i=0;i
如果我理解问题(
字节
要剥离的字节):

或者去除nsize大小的元素

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

是时候拿一支铅笔和一张纸了。@user13000627指针数据是如何生成的?data\u addr()是用户分配的源数据(未压缩数据)的动态内存地址。用户可以分配不同长度的多个源数据缓冲区,然后在用户数据()中进行最后的函数调用strip_header_;谢谢在剥离第一个和最后10个字节后,不需要memmove()任何数据。另外,我认为您引用的代码不能处理具有不同数据长度的多个缓冲区数据。@user13000627为什么这样认为?是什么阻止此代码在多个缓冲区上工作?如果我理解正确,buff->data\u addr仅对应于一个连续的单个缓冲区条目。但是
buff
可以是具有不同缓冲区的任何内容。你理解错了,对不起,我仍然不能得到你的代码,你提供的函数会先去掉每个源缓冲区(buff),最后去掉10个字节。这不是我所期望的。我想剥离完整源缓冲区数组中的前10个字节和最后10个字节。
void stripWholeArray(T_BUF_DATA *buff, size_t nbuffers, size_t nbytes)
{
    while(nbuffers--)
    {
        strip(buff++, nbytes);
    }
}