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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:32:40