我想在矩阵中复制文件,但它不起作用。我认为我的方法是将十六进制数转换成文件,可能我没有使用正确的说明符。对于算法,我认为这是正确的,但我不明白为什么第一行成为结果中的第一列。 这是我的结果:
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;
}
答案 0 :(得分:1)
问题是你正在用fscanf()将整数读入一个字节(uint8),该字节不足以容纳它。
取而代之的是:
fscanf(fp,"%x",&u);
(*result)[i][j] = (uint8_t)u;
其中u
是unsigned 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;
}