C语言中如何将二进制文件的二进制文本转换为字符串变量?
将二进制文本文件转换为C语言字符串变量
原代码通过fwrite将转换后的字节写入文件,要直接存入字符串变量,核心是用动态内存缓冲区替代文件输出,实时追加转换后的字节并按需扩容。以下是修改后的实现:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *binaryFile = fopen("binary.dat", "rb"); if (!binaryFile) { perror("Failed to open binary file"); return 1; } // 初始化动态字符串缓冲区,初始大小设为1024字节 char *result_str = malloc(1024); if (!result_str) { perror("Failed to allocate memory"); fclose(binaryFile); return 1; } size_t str_len = 0; // 当前字符串有效长度(不含'\0') size_t str_capacity = 1024; // 缓冲区总容量 unsigned char byte = 0; int bits = 0; for (;;) { char buffer[1024]; int len = fread(buffer, 1, sizeof(buffer), binaryFile); if (len <= 0) break; for (int i = 0; i < len; ++i) { switch (buffer[i]) { case '1': byte |= 1; break; case '0': // 0无需额外操作,保持byte当前位为0 break; default: continue; // 跳过非0/1字符 } if (++bits < 8) { byte <<= 1; // 左移一位,准备接收下一个bit } else { // 检查缓冲区是否足够,不够则扩容(每次翻倍) if (str_len + 1 >= str_capacity) { str_capacity *= 2; char *temp = realloc(result_str, str_capacity); if (!temp) { perror("Failed to reallocate memory"); free(result_str); fclose(binaryFile); return 1; } result_str = temp; } // 将转换后的字节追加到字符串 result_str[str_len++] = byte; // 重置状态,准备下一个字节 bits = 0; byte = 0; } } } // 处理剩余不足8位的情况 if (bits > 0) { // 剩余bits需要左移补0到8位(和原代码逻辑一致) byte <<= (8 - bits); if (str_len + 1 >= str_capacity) { str_capacity += 1; char *temp = realloc(result_str, str_capacity); if (!temp) { perror("Failed to reallocate memory"); free(result_str); fclose(binaryFile); return 1; } result_str = temp; } result_str[str_len++] = byte; } // 添加字符串结束符,确保是合法C字符串 result_str[str_len] = '\0'; // 示例:打印转换后的字符串 printf("Converted string: %s\n", result_str); // 释放资源 free(result_str); fclose(binaryFile); return 0; }
关键修改说明:
- 动态内存管理:用
malloc初始化缓冲区,realloc按需扩容(每次翻倍效率更高),避免固定大小缓冲区的溢出问题。 - 字符串追加逻辑:用
str_len跟踪当前有效字符数,每次生成完整字节后直接写入缓冲区对应位置,替代原代码的fwrite。 - 结束符处理:最后必须添加
'\0',否则无法作为C字符串使用(比如printf、strlen等函数依赖这个结束符)。 - 错误处理:补充了文件打开、内存分配失败的错误检查,避免程序崩溃。
- 修正原代码笔误:原代码最后
fclose(xmlFile)是错误的,改为关闭打开的binaryFile。
内容的提问来源于stack exchange,提问作者HighFiveBoss
相关产品推荐
相关产品推荐

