如何将十六进制文件转换为其等效的char文件?

时间:2019-11-05 10:59:09

标签: c

我有一个包含“ hello world”的文件。我已将其转换为十六进制文件“ 68656c6c6f20776f726c640a”。现在,我希望它将十六进制文件转换为其原始内容。我该怎么做?我尝试从十六进制文件中获取一个char并将其转换为等效字符,但是每次它只拾取一个char 6而不是68时。请帮忙。

int main()
{
     FILE *fp, *fptr;
     char c;
     fp = fopen ( "example1.txt", "r" ) ;
     fptr = fopen ( "example2.txt", "w" );
     while ( (c=fgetc(fp)) != EOF )
     {
          fputc(c, fptr);
     }
     fclose (fp);
     fclose(fptr);
     return 0;
}

预期输出:世界您好 我得到的输出是:68656c6c6f20776f726c640a

3 个答案:

答案 0 :(得分:2)

您应该读取两位数字作为十六进制值,这会将它们转换回一个字符:

like:

 int tmp;
 while ( fscanf(fp,"%2x",&tmp) > 0 )
 {      
     fputc(tmp, fptr);
 }

答案 1 :(得分:0)

实际上,如注释中所指出的那样,您应该阅读两个连续的字符,将它们组合起来(例如使用strtol)成一个十六进制数(ASCII值的十六进制表示),然后将其作为一个字符写入输出文件中。以下代码在VS2019上进行了测试:

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

#pragma warning(disable: 4996)

int main()
{
FILE* fp, * fptr;
char c1,c2;
fp = fopen("c:\\temp\\example1.txt", "r");
fptr = fopen("c:\\temp\\example2.txt", "w");
while ((c1 = fgetc(fp)) != EOF)
{
    unsigned char to_ascii;
    char s1[2] = { '\0','\0' }, s2[2] = { '\0','\0' };

    c2 = fgetc(fp);

    s1[0] = c1;
    s2[0] = c2;     

    to_ascii = 16 * strtol(s1,NULL,16) + strtol(s2, NULL,16);

    fprintf(fptr, "%c", to_ascii);
}
fclose(fp);
fclose(fptr);
return 0;
}

答案 2 :(得分:0)

您可以阅读并转换成对的字符。要将数字字符的字符集值转换为其数字值,请减去'0'。要将十六进制数字a-fA-F转换为10-15,请减去'A''a',然后加10。

将它们放在一起:

#include <stdio.h>
#include <ctype.h>  /* for isdigit, etc.    */

int hexdigitval(int c)
{
    if(isdigit(c)) return c - '0';
    if(isupper(c)) return c - 'A' + 10;
    if(islower(c)) return c - 'a' + 10;
    /* can't happen */
    return 0;
}

int main()
{
    int c1, c2;
    int d1, d2;
    int newc;

    while((c1 = getchar()) != EOF) {
        if(!isxdigit(c1)) continue;
        c2 = getchar();
        if(c2 == EOF) break;
        if(!isxdigit(c2)) continue;
        d1 = hexdigitval(c1);
        d2 = hexdigitval(c2);
        newc = 16 * d1 + d2;
        putchar(newc);
    }
}