我有一个包含“ 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
答案 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-f
或A-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);
}
}