从文本文件中读取十六进制数

时间:2014-06-20 13:18:15

标签: c hex scanf

我是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);
}

2 个答案:

答案 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的输出格式是一个编号。您需要将十六进制数字对复制到缓冲区并将每对转换为一个字节。这允许转换任何长度的十六进制字符串。