创建一个2D数组变量,指向与现有1D数组相同的内存

时间:2013-10-18 19:03:24

标签: c arrays aes

我正在为学校项目实施AES。我有一个函数aes_block,它接受uint8_t的一维数组(长度为16)作为消息;我想加密这条消息。第一步是将[0]中的[0],[1],......中的字节映射到二维状态数组s [0,0],s [1,0],s [2, 0],s [3,0],s [0,1],...,s [3,3],由FIPS 197.指定。我试图这样做:

void aes_block(int keylen, const uint8_t *key, uint8_t *msg){
    uint8_t state[4][4] = msg;
    ...
}

允许我按状态[col] [row]索引状态数组。 这给了我一个编译错误"无效的初始化程序&#34 ;;我怎样才能完成我想要做的事情?

3 个答案:

答案 0 :(得分:1)

对此的一个常见解决方案是以不同方式处理数组。

您可以使用arr[i][j]而不是arr[i*4+j]。最终结果是相同的,但不需要将数组复制到二维数组中。

答案 1 :(得分:1)

uint8_t (*state)[4] = (uint8_t (*)[4]) msg;

说明:

您希望将msg处的字节重新解释为4乘4的uint8_t数组。您可以将state定义为指向此类数组的指针:

uint8_t (*state)[4][4] = (uint8_t (*)[4][4]) msg;

但是,您必须使用(*state)[i][j]访问数组的元素。

相反,我们只是认识到C通常将数组转换为指向其第一个元素的指针,这使得数组索引工作得很好。所以我们模仿它并自己进行转换:我们声明state是指向数组数组的第一个元素的指针。因此,state是指向第一个四个uint8_t数组的指针。然后state可以像普通数组一样使用:state[i][j]是第i个数组的第j个元素。


注意:如果uint8_t是一种字符类型,就像主流硬件的所有正常C实现一样,这种重新解释是由C标准定义的。

答案 2 :(得分:0)

现在,您正在将指向uint8_t的指针分配给uint8_t的二维数组,这就是您收到该错误的原因。

您需要单独初始化变量state,然后使用for循环一次为msg分配一个条目。