我试图阅读简单的二元' hello world'文件并使用字符串将其写入另一个文件。出于某种原因,我想写的字符串会自动转换为十六进制代码,我无法对其进行任何操作。如何将字符串和二进制文件写入一个文件?
我得到了这个: 6c 69 6e 65 20 3d 20 4d 5a 90 00 03 00 ...
但我想要这个: line = 4d 5a 90 00 03 00 ...
6c 69 6e 65 20 3d 20 是一个字符串" line = "
#include <stdio.h>
int main(void)
{
FILE* in = fopen("hello.exe", "r");
FILE* out = fopen("out", "w");
if(in == NULL)
{
printf("Can't open in file\n");
return 1;
}
if(out == NULL)
{
printf("Can't open out file\n");
return 1;
}
int c;
fprintf(out, "line = ");
for(int i = 0; i < 16; i++)
{
c = fgetc(in);
fputc(c, out);
}
fclose(out);
fclose(in);
}
答案 0 :(得分:1)
首先,如果它是您正在阅读的二进制文件,则应将其作为二进制文件FILE* in = fopen("hello.exe", "rb");
打开。
然后,要编写十六进制代码,您可以使用fprintf
函数和X
转换运算符:
#include <stdio.h>
int main(void)
{
FILE* in = fopen("hello.exe", "rb");
FILE* out = fopen("out", "w");
if(in == NULL) {
printf("Can't open in file\n");
return 1;
}
if(out == NULL) {
printf("Can't open out file\n");
return 1;
}
unsigned int c;
fprintf(out, "line = ");
for(int i = 0; i < 16; i++)
{
c = fgetc(in);
fprintf(out, "%02X ",c);
}
fclose(out);
fclose(in);
}
使用此代码,您可以在out
文件中获得所需的输出。
无符号参数应转换为样式中的无符号十六进制格式&#34; dddd&#34 ;;字母&#34; ABCDEF&#34;使用。精度指定要显示的最小位数;如果转换的值可以用较少的数字表示,则应使用前导零进行扩展。默认精度为1.使用显式精度为零转换零的结果不应为字符。
答案 1 :(得分:0)
误解是文件不包含&#34; text&#34;或&#34; hex&#34;本身,它包含字节。你将会&#34;看到&#34;取决于你看待它的方式:
如果使用十六进制转储程序,您将看到十六进制值仅。
如果您使用发布文字的程序,例如echo
,你会看到test only (但是一些字节会导致屏幕上出现奇怪的符号)。