我正在尝试从单维数组生成2D数组,以在Rijndael或AES加密过程中生成数据状态。我一直在尝试使用此代码;
public byte[,] MakeAState(byte[] block){
byte[,] State;
foreach (byte i in block)
for (int row = 0; row < 4; row++)
for (int column = 0; column < 4; column++)
State[column, row] = i;
return State;
}
我打算让结果像这样
//Original Sequence
[99 111 98 97 112 97 115 115 99 111 98 97 112 97 115 115]
//Desired Sequence
[99 112 99 112]
[111 97 111 97]
[98 115 98 115]
[97 115 97 115]
结果总是出现,好像Block的元素一样使用了State数组的索引,导致出现'out-of boundary'错误消息。关于如何管理这个的任何想法?
答案 0 :(得分:3)
您可能会在row
上翻转column
和State[column, row] = i;
,这可能导致您的越界异常。但是,如果没有关于变量的更多信息,就无法分辨。
但这不是唯一的问题。假设您只想将数组拆分为四个一组。如果您翻转row
/ column
并超越您的例外,这就是您目前的情况。
//Original sequence:
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
//Desired sequence:
[0 4 8 12]
[1 5 9 13]
[3 6 10 14]
[4 7 11 15]
//What you are currently getting:
[15 15 15 15]
[15 15 15 15]
[15 15 15 15] //<-- Last value of original sequence, everywhere.
您的代码中发生的事情是Block
中的每个位置都放置在新数组中的每个位置,这意味着您最终会得到一个填充了Block
的最后一个值的数组算法完成了。
将其更改为此类会返回您想要的结果。
public static byte[,] State(byte[] Block)
{
if (Block.Length % 16 != 0)
throw new Exception("Byte array length must be divisible by 16.");
var rowCount = Block.Length / 4;
var State = new byte[rowCount, 4];
for (int column = 0, block = 0; column < 4; column++)
for (int row = 0; row < rowCount; row++, block++)
State[row, column] = Block[block];
return State;
}
答案 1 :(得分:3)
这应该是你想要的,并且它使用除法和模来确定列和行(只需切换&#34; i%4&#34;用&#34; i / 4&#34;如果你想转动矩阵):
class Program
{
static void Main(string[] args)
{
byte[] original = new byte[] { 99, 111, 98, 97, 112, 97, 115, 115, 99, 111, 98, 97, 112, 97, 115, 115 };
byte[,] result = MakeAState(original);
for (int row = 0; row < 4; row++)
{
for (int column = 0; column < 4; column++)
{
Console.Write(result[row,column] + " ");
}
Console.WriteLine();
}
}
public static byte[,] MakeAState(byte[] block)
{
if (block.Length < 16)
{
return null;
}
byte[,] state = new byte[4,4];
for (int i = 0; i < 16; i++)
{
state[i % 4, i / 4] = block[i];
}
return state;
}
}
}
输出:
99 112 99 112
111 97 111 97
98 115 98 115
97 115 97 115