使用C中的fscanf()将uint8复制到矩阵中

时间:2013-09-27 12:19:50

标签: c file scanf

我想在矩阵中复制文件,但它不起作用。我认为我的方法是将十六进制数转换成文件,可能我没有使用正确的说明符。对于算法,我认为这是正确的,但我不明白为什么第一行成为结果中的第一列。 这是我的结果:

63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7c 0 ...
77 0 ...
7b 0 ...
f2 0 ...
6b 0 ...
6f 0 
c5 0 
30 0 
1 0  
67 0 
2b 0 
fe 0 
d7 0 ...
ab 0 ...
76 0 ...

第一列对应于文件的第一行。 谢谢你的帮助 看看我的节目

typedef uint8_t Sbox [16][16];

const int SBOX_ROWS = 16;
const int SBOX_COLS = 16;

Sbox* read_sbox(FILE *fp)
{

    Sbox* result = NULL;
    int i,j;
    if (fp != NULL)
    {
        result = (Sbox*)malloc(sizeof(Sbox));
        for (i = 0 ; i < SBOX_ROWS ; i++)
        {
            for (j = 0 ; j < SBOX_COLS-1 ; j++)
            {
                fscanf(fp,"%x",result[i][j]);
            }
            fscanf(fp,"%x\n",result[i][SBOX_COLS-1]);
        }
    }
    return result;
}

int main()
{
    FILE* fp = NULL;
    Sbox* res = NULL;
    int i,j;
    if ((fp = fopen("sbox.txt", "r")) == NULL)
    {
        fprintf(stderr, "Failed to open file: sbox.txt\n");
        exit(1);
    }
    else
    {
        printf("Dans else\n");
        res = read_sbox(fp);
    }
    if (res == NULL)
    {
        printf("res NULL\n");       
    }
    for (i = 0 ; i < SBOX_ROWS ; i++)
        {
            for (j = 0 ; j < SBOX_COLS-1 ; j++)
            {
                printf("%x ",(*res)[i][j]);
            }
           printf("%x\n",(*res)[i][j]);
        } 
    return 0;
}

2 个答案:

答案 0 :(得分:1)

问题是你正在用fscanf()将整数读入一个字节(uint8),该字节不足以容纳它。

取而代之的是:

fscanf(fp,"%x",&u);
(*result)[i][j] = (uint8_t)u;

其中uunsigned int

答案 1 :(得分:1)

Sbox* read_sbox(FILE *fp)
{
    unsigned int u;
    Sbox* result = NULL;
    int i,j;
    if (fp != NULL)
    {
        result = (Sbox*)malloc(sizeof(Sbox));
        for (i = 0 ; i < SBOX_ROWS ; ++i)
        {
            for (j = 0 ; j < SBOX_COLS-1 ; ++j)
            {
                fscanf(fp,"%x",&u);
            (*result)[i][j] = (uint8_t)u; 
            }
            fscanf(fp,"%x\n",&u);
            (*result)[i][SBOX_COLS-1] = (uint8_t) u;
        }
    }
    return result;
}