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

