c - C - 使用 fscanf 从文件中读取十六进制和字符
问题描述
我有两个文件。第一个文件(在指针中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
aschar
和k_char
asunsigned 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"
. 因此代码与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 将在一两年内完成。
推荐阅读
- c# - 控制台在 Macbook Pro 上的 Visual Studio 中根本不会输出或显示
- javascript - Getting "Undefined" value for Variable even though i have defined variable
- python - tkinter image change within a label when i gpio state changes
- c++ - Initialisation of const member array c++17
- java - why does it show aarayindexoutofboundexception on changing the t[n] though it is under limits
- python - Why isn't my virtualenv opening up in visual studio code?
- javascript - ReactJS- How to set new property on window?
- c# - C# Get Label Address For Lookup Table?
- android - How can i create this type of user interface?
- c - C program with fifo is not working, Unix console waits for input