我有两个文件。第一个文件(在指针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_char
为char
,k_char
为unsigned 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将在一两年内到期。