C正在将字符串转换为十六进制

时间:2018-03-24 12:40:39

标签: c file binary hex

我试图阅读简单的二元' 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);
}

2 个答案:

答案 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文件中获得所需的输出。

Note: I changed your c variable to an unsigned int because the X conversion works on unsigned argument:

  

无符号参数应转换为样式中的无符号十六进制格式&#34; dddd&#34 ;;字母&#34; ABCDEF&#34;使用。精度指定要显示的最小位数;如果转换的值可以用较少的数字表示,则应使用前导零进行扩展。默认精度为1.使用显式精度为零转换零的结果不应为字符。

答案 1 :(得分:0)

误解是文件不包含&#34; text&#34;或&#34; hex&#34;本身,它包含字节。你将会&#34;看到&#34;取决于你看待它的方式:

如果使用十六进制转储程序,您将看到十六进制值

如果您使用发布文字的程序,例如echo,你会看到test only (但是一些字节会导致屏幕上出现奇怪的符号)。