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

