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

C语言如何直接读取硬盘中文本文件存储的原始二进制数据

你要获取硬盘/内存中存储的字符串原生二进制内容,不需要做额外的字符串转二进制操作,直接按字节读取存储区域即可,具体方法如下:

硬盘文件原生二进制读取方法

文件在硬盘上本身就是以连续字节的二进制形式存储的,只要读取时不做任何转码、格式转换,拿到的就是可供汇编直接调用的原生数据:

  • 打开文件时必须使用二进制只读模式,给fopen传入"rb"参数,该模式下会跳过所有文本模式默认的换行符转换、编码转义逻辑,读取的字节和硬盘存储内容完全一致。
  • 先计算文件总字节长度:通过fseek将文件指针移动到文件末尾,调用ftell获取当前指针偏移量即为文件总字节数,之后调用rewind将指针重置到文件起始位置。
  • 申请和文件大小等长的unsigned char类型缓冲区,用fread一次性将所有文件字节读入缓冲区,缓冲区中存储的就是你需要的原生二进制数据,可以直接传入KMP算法或者供汇编程序调用。

参考实现代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("test.txt", "rb");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }

    // 计算文件字节长度
    fseek(fp, 0, SEEK_END);
    long file_len = ftell(fp);
    rewind(fp);

    // 申请缓冲区存储原生二进制数据
    unsigned char *bin_buf = (unsigned char*)malloc(file_len);
    if (bin_buf == NULL) {
        perror("申请内存失败");
        fclose(fp);
        return EXIT_FAILURE;
    }

    // 读取全部内容
    size_t read_cnt = fread(bin_buf, 1, file_len, fp);
    if (read_cnt != file_len) {
        perror("读取文件内容异常");
        free(bin_buf);
        fclose(fp);
        return EXIT_FAILURE;
    }

    // 此处bin_buf指向的内存块就是test.txt的原生二进制内容
    // 可直接传入KMP算法、或作为参数传给汇编逻辑
    // 例:逐字节打印十六进制值验证
    for (long i = 0; i < file_len; i++) {
        printf("%02X ", bin_buf[i]);
    }

    // 释放资源
    free(bin_buf);
    fclose(fp);
    return EXIT_SUCCESS;
}
内存中字符串原生二进制访问方法

如果字符串已经被加载到C语言的内存空间中,不需要做任何读取操作:C语言的字符串本身就是连续存储的原生二进制字节数组,直接取字符串的首地址即可访问对应二进制内容,直接将char*类型的字符串指针传入算法即可,不需要额外转换。

注意事项
  • 禁止使用"r"默认文本模式打开文件,Windows平台下文本模式会自动将硬盘上存储的\r\n换行字节替换为\n,部分编译环境还会做多字节编码的自动转码,最终拿到的内容和原生存储不一致。
  • 存储二进制数据的缓冲区必须使用unsigned char类型,避免有符号char的符号位扩展问题,保证每个字节的取值范围在0-255之间,和原生存储值完全匹配。
  • 读取到的二进制数据是和文件编码对应的原始字节,比如你存的是ASCII编码的"AAABVAVBBA",每个字节就对应该字符的ASCII值,和你预期的KMP算法输入完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:45:43