代码之家  ›  专栏  ›  技术社区  ›  SCFrench

在C++中将字节序列重复到较大缓冲区的最简单方法

  •  5
  • SCFrench  · 技术社区  · 17 年前

    char * byte_sequence;
    size_t byte_sequence_length;
    char * buffer;
    size_t N;
    

    byte_sequence byte_sequence_length 初始化为任意长度的字节序列(及其长度),以及 buffer 已初始化为指向 N * byte_sequence_length 字节,复制 进入 缓冲器 N 时代?STL/BOOST中有没有已经做过类似的事情?

    N 当时是3岁 最终将包含“abcdabcdabcd”。

    4 回复  |  直到 17 年前
        1
  •  12
  •   Salman A    17 年前

    我可能会这么说:

    for (int i=0; i < N; ++i)
        memcpy(buffer + i * byte_sequence_length, byte_sequence, byte_sequence_length);
    

    这假设您处理的是二进制数据,并且跟踪长度,而不是使用 '\0' 结束

    如果希望这些是c字符串,则必须分配额外的字节并添加 '\0'

    char *RepeatN(char *source, size_t n)
    {
        assert(n >= 0 && source != NULL);            
        size_t length = strlen(source) - 1;
        char *buffer = new char[length*n + 1];
        for (int i=0; i < n; ++i)
            memcpy(buffer + i * length, source, length);
        buffer[n * length] = '\0';
    }
    
        2
  •  7
  •   Brian R. Bondy    17 年前

    在避免指针运算的同时重复缓冲区:

    您可以使用std::vector<char>或者std::string,让事情变得更简单。这两个容器也可以保存二进制数据。

    • 您不必担心内存访问冲突
    • 你不必担心你的尺寸 对的
    • 您可以随时将序列附加到缓冲区,而无需手动重新分配

    .

    //Note this works even for binary data.
    void appendSequenceToMyBuffer(std::string &sBuffer
           , const char *byte_sequence
           , int byte_sequence_length
           , int N)
    {
      for(int i = 0; i < N; ++i)
          sBuffer.append(byte_sequence, byte_sequence_length);
    }
    
    //Note: buffer == sBuffer.c_str()
    

    buffer = new char[byte_sequence_length*N];
    for (int i=0; i < N; ++i)
      memcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length); 
    //...
    delete[] buffer;
    

    备选:对于使用strcpy的以null结尾的字符串数据:

    buffer = new char[byte_sequence_length*N+1];
    int byte_sequence_length = strlen(byte_sequence);
    for (int i=0; i < N; ++i)
      strcpy(buffer+i*byte_sequence_length, byte_sequence, byte_sequence_length); 
    //...
    delete[] buffer;
    

    备选方案:如果使用单个值填充缓冲区:

    buffer = new char[N];
    memset(buffer, byte_value, N);
    //...
    delete[] buffer;
    
        3
  •  4
  •   Mark Ransom    17 年前

    assert((N > 0) && ((N & (N-1)) == 0));
    memcpy(buffer, byte_sequence, byte_sequence_length);
    for (size_t i = 1;  i < N;  i *= 2)
        memcpy(buffer + i * byte_sequence_length, buffer, i * byte_sequence_length);
    

    编辑: 当N为 2的幂。这是一个改进的版本,它删除了N上的所有约束,并用while替换了奇for语句。

    if (N > 0)
        memcpy(buffer, byte_sequence, byte_sequence_length);
    size_t copied = 1;
    while (copied < N)
    {
        size_t tocopy = min(copied, N - copied);
        memcpy(buffer + copied * byte_sequence_length, buffer, tocopy * byte_sequence_length);
        copied += tocopy;
    }
    
        4
  •  4
  •   mwigdahl    6 年前

    您可以使用STL算法生成:

    MSDN: Generate