1

マトリックス内のファイルをコピーしたいのですが、うまくいきません。16 進数をファイルに入れる方法に問題があると思います。正しい指定子を使用していない可能性があります。アルゴリズムについては、正しいと思いますが、最初の行が結果の最初の列になる理由がわかりません。これは私が持っている結果です:

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
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 に答える
1

問題は、fscanf() を使用して整数をバイト (uint8) に読み込んでいて、それを保持するのに十分な大きさではないことです。

代わりに次のようにします。

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

はどこuにありますかunsigned int

于 2013-09-27T12:29:59.260 に答える