如何用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
相关产品推荐
相关产品推荐

