我是C的新手,想问一下我在一段时间内一直在努力的问题。 :(请帮忙!
我想读一个纯文本文件,passout.txt包含一个十六进制字符串,如:
A1B2C3D4E5403E9D501B223AD45523D6
并将它们放入如下数组:
{A1, B2, C3, D4, E5, 40, 3E, 9D, 50, 1B, 22, 3A, D4, 55, 23, D6}
但是,我当前的输出仅为:
{D4, 55, 23, D6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
只能检索最后四个十六进制数!我真的不知道自己犯了什么错误,而且我无法从网上找到任何相关的解决方案!因此,有人可以帮忙吗?
这是我的代码!
#include <stdio.h>
#include <string.h>
#include <openssl/aes.h>
#define AES_BLOCK_SIZE 16
void main()
{
FILE *ifp;
int i, rv;
unsigned char in[AES_BLOCK_SIZE] = {0};
ifp = fopen("passout.txt", "r");
// loop and read the input file
for(i = 0; i < AES_BLOCK_SIZE; i++)
{
rv = fscanf(ifp, "%X", &in[i]);
if(rv != 1)
i = AES_BLOCK_SIZE;
}
printf("Print result: \n");
for(i=0; i < AES_BLOCK_SIZE; i++)
printf("%X ",*(in+i));
printf("\n");
fclose(ifp);
}
答案 0 :(得分:1)
rv = fscanf(ifp, "%X", &in[i]);
更改为
rv = fscanf(ifp, "%2hhX", &in[i]);
for C99
unsigned X;
rv = fscanf(ifp, "%2X", &X);
if(rv != 1)
break;
in[i] = (unsigned char)X;
答案 1 :(得分:0)
您的方法失败,因为sscanf的输出格式是一个号。
您的方法失败,因为sscanf的输出格式是一个编号。您需要将十六进制数字对复制到缓冲区并将每对转换为一个字节。这允许转换任何长度的十六进制字符串。