1

我想在矩阵中复制一个文件,但它不起作用。我认为将十六进制数字放入文件的方式存在问题,也许我没有使用正确的说明符。对于算法,我认为它是正确的,但我不明白为什么第一行成为结果中的第一列。这是我的结果:

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;
}
4

2 回答 2

1

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

而是这样做:

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

哪里uunsigned int

于 2013-09-27T12:29:59.260 回答
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;
}
于 2013-09-27T12:50:04.987 回答