如何解决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_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,&k_char);
}
fclose(key_file);
return 0;
}
在for循环的一次迭代之后,VS Code编辑器向我显示了“分段错误”。当我将k_char
更改为int
时,一切正常。我将继续发布有关此问题的发现。
解决方法
OP使用的VS C版本可能not understand "%hhX"
。形式上,这是未定义的行为,*scanf()
可能会忽略"hh"
。因此,代码可以与int
一起使用。
要应对缺乏"hh"
理解的类似C89的编译器,请使用中间对象。
// fscanf(key_file,"%2hhX",&k_char);
unsigned utemp = 0;
fscanf(key_file,"%2X",&utemp);
k_char = utemp;
...或使用至少符合21年历史的C99标准(如果不是C11或C17)的编译器。 C2x会在一两年内到期。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。