You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言实现Node.js中Buffer.concat的等效功能?

在C语言中实现类似Node.js Buffer.concat的二进制缓冲区合并功能

首先,咱们得先搞清楚Node.js里Buffer.concat的核心逻辑:它会先统计所有输入Buffer的总字节长度,然后分配一块足够大的内存,最后把每个Buffer的内容按顺序拷贝到这块新内存里,返回合并后的Buffer。这个逻辑在C语言里完全可以复刻,而且要注意处理二进制数据时不能用字符串拼接函数(比如sprintf)——因为二进制数据可能包含\0字符,会导致字符串函数提前终止,而Buffer.concat是处理任意二进制数据的。

核心实现步骤

  • 第一步:遍历所有要合并的缓冲区,计算总字节数
  • 第二步:用malloc分配对应大小的内存块(记得检查分配是否成功)
  • 第三步:依次将每个缓冲区的内容拷贝到新内存块的对应位置
  • 第四步:使用完合并后的缓冲区后,用free释放内存,避免泄漏

示例1:复刻你的Node.js代码逻辑

你的Node.js代码是合并三个分别存'a'、'b'、'c'的Buffer,对应的C实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    // 模拟三个待合并的缓冲区
    unsigned char buf1[] = {'a'};
    size_t len1 = sizeof(buf1);
    
    unsigned char buf2[] = {'b'};
    size_t len2 = sizeof(buf2);
    
    unsigned char buf3[] = {'c'};
    size_t len3 = sizeof(buf3);
    
    // 1. 计算总长度
    size_t total_len = len1 + len2 + len3;
    
    // 2. 分配内存
    unsigned char *merged_buf = (unsigned char*)malloc(total_len);
    if (merged_buf == NULL) {
        perror("malloc failed");
        return 1;
    }
    
    // 3. 依次拷贝内容
    unsigned char *current_ptr = merged_buf;
    memcpy(current_ptr, buf1, len1);
    current_ptr += len1;
    
    memcpy(current_ptr, buf2, len2);
    current_ptr += len2;
    
    memcpy(current_ptr, buf3, len3);
    
    // 输出合并后的结果(十六进制格式,和Node.js的输出风格一致)
    printf("<Buffer ");
    for (size_t i = 0; i < total_len; i++) {
        printf("%02x ", merged_buf[i]);
    }
    printf(">\n");
    
    // 4. 释放内存
    free(merged_buf);
    return 0;
}

运行这段代码会输出:<Buffer 61 62 63 >,和Node.js里Buffer.concat([Buffer.from('a'), Buffer.from('b'), Buffer.from('c')])的二进制内容完全一致。

示例2:针对你现有C代码的场景优化

看你现有代码里要合并bgg和cipher,但用sprintf存在隐患(比如如果bgg或cipher里有\0就会截断),改成二进制合并的正确写法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    unsigned char subbuff[64] = "56c5252cd3722bfd3c3147a806bbddaf68b01e020c0cfb60450724a3af45641f";
    unsigned char cipher[64] = "7e4062b503373f144d7014d8f040ed1ac5c11302a2ffe83789015665e955ff09";
    char bgg[16];
    
    // 从subbuff拷贝16字节到bgg
    memcpy(bgg, &subbuff[16], 16);
    // 注意:这里如果bgg是作为二进制数据,不要加'\0',除非你确定是字符串
    // bgg[15] = '\0';  // 如果你要处理字符串可以保留,但二进制合并不需要
    
    // 计算总长度:bgg的16字节 + cipher的64字节(假设cipher是满64字节的二进制数据)
    size_t len_bgg = 16;
    size_t len_cipher = 64;
    size_t total_len = len_bgg + len_cipher;
    
    // 分配内存
    unsigned char *merged_buf = (unsigned char*)malloc(total_len);
    if (merged_buf == NULL) {
        perror("malloc failed");
        return 1;
    }
    
    // 合并缓冲区
    unsigned char *current_ptr = merged_buf;
    memcpy(current_ptr, bgg, len_bgg);
    current_ptr += len_bgg;
    memcpy(current_ptr, cipher, len_cipher);
    
    // 输出十六进制格式的结果
    printf("<Buffer ");
    for (size_t i = 0; i < total_len; i++) {
        printf("%02x ", merged_buf[i]);
    }
    printf(">\n");
    
    // 释放内存
    free(merged_buf);
    return 0;
}

关键注意点

  • 永远不要用字符串处理函数(sprintf、strcat等)处理二进制缓冲区,因为二进制数据可能包含\0,会导致数据截断
  • 分配内存后一定要检查malloc的返回值,避免空指针错误
  • 使用完动态分配的内存后必须用free释放,防止内存泄漏

内容的提问来源于stack exchange,提问作者dsdsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:33:02