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

C语言使用strcat拼接位图数据仅前几字节正确其余为乱码如何解决

问题原因

你遇到的问题核心是错误使用字符串处理函数操作二进制数据:

  • C语言的strcat函数是专门用来拼接以\0(即0x00字节)作为结束标记的C字符串的,它会从源地址开始复制,直到遇到第一个0x00字节就停止复制,同时会在目标字符串末尾额外追加一个0x00作为结束标记。
  • 你要拼接的BMP文件头、信息头、像素数据都属于二进制数据,本身包含大量0x00字节(比如文件头里的保留字段默认就是0),strcat遇到第一个0x00就会终止复制,因此只会复制前几个字节,后续数据不会被复制,多余的内存空间就是未初始化的乱码,额外追加的0x00还会破坏原二进制数据的结构。
解决方案

不要使用strxxx系列的字符串处理函数操作二进制数据,改用memcpy按指定字节数复制内容,手动控制拼接偏移量即可。修改后的代码参考如下:

char* fileHeader = createBitmapFileHeader(height, stride);  //14 bytes
char* infoHeader = createBitmapInfoHeader(height, width);   //40 bytes
char* pixels;
pixels = (char*)malloc(246*sizeof(char));
// 不需要再初始化pixels[0]='\0',memcpy不需要字符串结束标记

int offset = 0;
// 拼接14字节的BMP文件头
memcpy(pixels + offset, fileHeader, 14);
offset += 14;
// 拼接40字节的BMP信息头
memcpy(pixels + offset, infoHeader, 40);
offset += 40;
// 拼接192字节的图像像素数据
memcpy(pixels + offset, image, 192);

memcpy会严格按照你指定的字节数复制内存内容,不会因为中间出现0x00就终止,完全满足二进制数据拼接的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:02