C-使用fscanf从文件中读取十六进制和字符



我有两个文件。第一个文件(在指针key_file中(具有以下十六进制内容(注意,每两个字符对应一个十六进制字节(:

18FC5E66F9F205488BFC0E9E

另一个文件(在指针p_text_file中(具有以下内容

hernandariov

我想在这两个值之间进行逐位XOR,并将结果保存在另一个文件中(指针c_text_file中(。我用C写了以下(缩写(代码:

char p_text_char;
unsigned char k_char;
for(int i = 0; i < LEN; i++) {
fscanf(key_file, "%2hhX", &k_char);
fscanf(p_text_file, "%c", &p_text_char); 
fprintf(c_text_file, "%02X", k_char ^ p_text_char);
}

但当我执行代码时,它会以非零值退出,即出现错误。在尝试了许多解决方案后,我发现如果将p_text_char的类型更改为int,代码运行得很好,但我想知道原因。事实上,我想保持p_text_charchark_charunsigned char,因为在我正在研究的问题(一次性加密方案(中,这些都是这些变量的自然类型和大小。我正在使用MinGw编译器在Windows上工作。

谢谢。

-编辑-

在这个代码中运行了一个调试器之后,我发现有一个"分段故障";。为了找出错误,我尽量减少代码。首先,我用前面显示的文件尝试以下代码:

#include <stdio.h>
#define LEN 12
int main() {
FILE *key_file;
key_file = fopen("key.txt", "r");
if(key_file == NULL) {
printf("ERROR: cannot read the files.");
return 1;
}
unsigned char k_char;
for(int i = 0; i < LEN; i++) {
fscanf(key_file, "%2hhX", &k_char);
}
fclose(key_file);
return 0;
}

在for循环的一次迭代之后,VS代码编辑器向我显示一个";分段故障";。当我将k_char更改为int时,一切都很好。我将继续发布我对这个问题的调查结果。

OP使用的VS C版本可能无法理解"%hhX"。形式上,这是未定义的行为*scanf()可以忽略"hh"。因此代码";作品";具有CCD_ 15。

要处理缺乏"hh"理解的类似C89的编译器,请使用一个中间对象。

// fscanf(key_file, "%2hhX", &k_char);
unsigned utemp = 0;
fscanf(key_file, "%2X", &utemp);
k_char = utemp;

或者使用至少符合已有21年历史的C99标准(如果不是C11或C17的话(的编译器。C2x将在一两年内到期。

最新更新