【问题标题】:copying uint8 into a matrix using fscanf() in C在 C 中使用 fscanf() 将 uint8 复制到矩阵中
【发布时间】:2013-09-27 12:19:49
【问题描述】:

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

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

【问题讨论】:

  • result = (Sbox*)malloc(sizeof(Sbox) * SBOX_ROWS * SBOX_COLS); 为什么不简单地成为result = (Sbox*)malloc(sizeof(Sbox)); ???
  • fscanf 得到一个指向它读入的内存的指针,如下所示: fscanf(fp,"%x",&result[i][j]); fscanf(fp,"%x\n",&result[i][SBOX_COLS-1]);
  • 通常情况下,我们为每行做一个malloc,为每一行做一个malloc。另外,我认为您不需要单独处理fscanf(fp,"%x\n"
  • @Desolator 我修改了但它不起作用
  • @dragosht :我认为是一样的。

标签: c file scanf


【解决方案1】:

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

改为:

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

其中uunsigned int

【讨论】:

  • 感谢您发布正确的代码,我编辑了我的。 @JonathanIlambo
【解决方案2】:
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;
}

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2012-12-11
    • 2013-04-26
    • 2013-11-18
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多