C - 使用 fscanf 从文件中读取十六进制和字符
C - Using fscanf for reading hexadecimal and characters from files
我有两个文件。第一个文件(在指针key_file
中)有以下十六进制内容(注意每两个字符对应一个十六进制字节):
18FC5E66F9F205488BFC0E9E
而另一个文件(在指针p_text_file
中)具有以下内容
hernandariov
我想在这两个值之间写按位异或并将结果保存在另一个文件中(在指针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 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 一两年后到期。
我有两个文件。第一个文件(在指针key_file
中)有以下十六进制内容(注意每两个字符对应一个十六进制字节):
18FC5E66F9F205488BFC0E9E
而另一个文件(在指针p_text_file
中)具有以下内容
hernandariov
我想在这两个值之间写按位异或并将结果保存在另一个文件中(在指针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 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 一两年后到期。