C语言文件操作问题:如何在同一文件写入字符串与二进制数据?
解决字符串被转成十六进制的问题
看起来你是把要保留的明文字符串和二进制数据一起做了十六进制编码处理,才导致"line = "变成了6c 69 6e 65 20 3d 20。要实现你想要的效果,需要把明文字符串直接写入文件,再将二进制数据转换成十六进制字符串追加到后面,两者分开处理就行。
关键修改点
- 读取二进制文件时,一定要用
"rb"模式,避免Windows下的换行符转换问题。 - 先写入明文字符串
"line = ",再处理二进制数据的十六进制转换。 - 每个二进制字节转成两位十六进制字符,注意小写/大写的需求(你示例里是小写,用
%02x即可)。
完整示例代码
#include <stdio.h> #include <stdlib.h> int main(void) { // 打开输入文件,二进制模式 FILE* in = fopen("hello.exe", "rb"); if (!in) { perror("Failed to open input file"); return EXIT_FAILURE; } // 打开输出文件,文本模式(写入的都是ASCII字符,也可以用wb) FILE* out = fopen("output.txt", "w"); if (!out) { perror("Failed to open output file"); fclose(in); return EXIT_FAILURE; } // 先写入明文字符串,这部分直接输出,不转十六进制 fprintf(out, "line = "); // 逐个读取二进制字节,转成十六进制写入 unsigned char byte; while (fread(&byte, sizeof(unsigned char), 1, in) == 1) { // %02x 表示输出两位十六进制,不足补0,小写;要大写用%02X fprintf(out, "%02x ", byte); } // 收尾工作:关闭文件 fclose(in); fclose(out); return EXIT_SUCCESS; }
代码解释
fprintf(out, "line = ");直接把字符串写入输出文件,这部分是明文,不会被编码。fread(&byte, sizeof(unsigned char), 1, in)每次读取一个二进制字节,确保不会因为文本模式的问题丢失数据。%02x格式化符把单个字节转换成两位十六进制字符串,比如字节0x4D会变成4d,和你期望的格式一致。
这样运行后,输出文件里就会是你想要的:line = 4d 5a 90 00 03 00...
内容的提问来源于stack exchange,提问作者delxa
相关产品推荐
相关产品推荐

