Arrays 更新函数内部的二维数组
我一直试图通过将2d数组作为参数传递给函数来更新它,但我似乎不理解它是如何工作的,我在下面展示了一个示例,它工作正常,它更新了值Arrays 更新函数内部的二维数组,arrays,c,multidimensional-array,Arrays,C,Multidimensional Array,我一直试图通过将2d数组作为参数传递给函数来更新它,但我似乎不理解它是如何工作的,我在下面展示了一个示例,它工作正常,它更新了值 void substitution_sbox(uint8_t a[4][4]) { int index1, index2; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ index1 = a[i][j] >> 4; inde
void substitution_sbox(uint8_t a[4][4]) {
int index1, index2;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
index1 = a[i][j] >> 4;
index2 = a[i][j] & 0x0f;
printf("index[1]: %x and index[2]: %x\n", index1, index2);
a[i][j] = g_aes_sbox[index2 + (16 * index1)];
// g_aes_sbox[] is a globally defined array.
}
}
}
uint8_t plain_text[4][4] = { {0x32, 0x43, 0xF6, 0xA8}, {0x88, 0x5A, 0x30, 0x8D}, {0x31, 0x31, 0x98, 0xA2}, {0xE0, 0x37, 0x07, 0x34} };
//after calling substitution from here..
// SUBSTITUTION.
printf("calling substitution\n");
substitution_sbox(plain_text);
// this function when printing, updates the array correctly.
现在,如果我尝试在另一个函数中调用相同的数组,它不会像我所想的那样更新-
void row_shift(uint8_t a[4][4]) {
for(int i=1;i<4;i++){
for(int j=0;j<4;j++){
// rotate this row by i positions, to the left.
// m = no. of rotations.
for(int m=0;m<i;m++) {
// rotate by one.
uint8_t temp = a[i][0];
for(int n=0;n<4;n++) {
a[i][n] = a[i][n+1];
}
a[i][3] = temp;
// rotate by one
}
for(int g=0;g<4;g++) printf("%04x ",a[i][g]);
printf("\n");
}
}
}
此函数不会更改数组,数组保持不变,是否有人可以帮助我了解在这两种情况下更新是如何工作的?
多谢各位
在这两种情况下,更新是如何工作的
在替换方面无法帮助您,因为关于g_aes_sbox的一切都是未知的
不管怎样,你为什么要做这么复杂的事情
index1 = a[i][j] >> 4;
index2 = a[i][j] & 0x0f;
...
a[i][j] = g_aes_sbox[index2 + (16 * index1)];
而不是
a[i][j] = g_aes_sbox[a[i][j]];
因为a是uint8的数组,index2+16*index1的值是a[i][j]&0x0f+16*a[i][j]>>4是a[i][j]
此函数不会更改数组,数组保持不变
首先,您有一个未定义的行为:
for(int n=0;n<4;n++) {
a[i][n] = a[i][n+1];
}
当i和n值为3时,将[3][3]与数组外的[3][4]赋值,则行为未定义
碰巧,未定义的行为可能没有明显的影响,并且您在[i][3]=temp之后取消了错误的赋值
正确的方法是测试n
在这两种情况下,更新是如何工作的
在替换方面无法帮助您,因为关于g_aes_sbox的一切都是未知的
不管怎样,你为什么要做这么复杂的事情
index1 = a[i][j] >> 4;
index2 = a[i][j] & 0x0f;
...
a[i][j] = g_aes_sbox[index2 + (16 * index1)];
而不是
a[i][j] = g_aes_sbox[a[i][j]];
因为a是uint8的数组,index2+16*index1的值是a[i][j]&0x0f+16*a[i][j]>>4是a[i][j]
此函数不会更改数组,数组保持不变
首先,您有一个未定义的行为:
for(int n=0;n<4;n++) {
a[i][n] = a[i][n+1];
}
当i和n值为3时,将[3][3]与数组外的[3][4]赋值,则行为未定义
碰巧,未定义的行为可能没有明显的影响,并且您在[i][3]=temp之后取消了错误的赋值
正确的方法是测试n数组实际上是在函数row_shift中更改的,只是每行旋转4倍。因为每一行的长度为4,所以最终的效果是该行看起来没有变化,即
第0行未旋转。
第1行旋转4次4*1。
第2行旋转8次4*2。
第3行旋转12次3*4。
第一个嵌套循环
for(int j=0;j<4;j++){
....
}
我想这就是问题所在。如果删除该选项,您将发现行分别旋转了0、1、2和3次
除此之外,还有一个bug,它通过数组上的越界访问来识别。你也必须解决这个问题。数组实际上是在函数row\u shift中更改的,只是每行旋转了4倍。因为每一行的长度为4,所以最终的效果是该行看起来没有变化,即
第0行未旋转。
第1行旋转4次4*1。
第2行旋转8次4*2。
第3行旋转12次3*4。
第一个嵌套循环
for(int j=0;j<4;j++){
....
}
我想这就是问题所在。如果删除该选项,您将发现行分别旋转了0、1、2和3次
除此之外,还有一个bug,它通过数组上的越界访问来识别。您也必须修复它。好的,我明白了,先生,这是我第一次使用uint8\t数据类型。我试图将每一行向左旋转一些值,即第一行0个位置,第二行1个位置,依此类推。我想我把逻辑搞乱了。g_aes_sbox[]是一个包含256个值的1D单元数组;nokay,我明白了,先生,这是我第一次使用uint8_t数据类型。我试图将每一行向左旋转一些值,即第一行0个位置,第二行1个位置,依此类推。我想我把逻辑搞乱了。g_aes_sbox[]是一个包含256个值的1D单元数组;非常感谢你,我现在明白了。非常感谢你,我现在明白了。