【问题标题】:Converting single dimension array to a 2D array in C# for AES data matrix在 C# 中将一维数组转换为 AES 数据矩阵的二维数组
【发布时间】:2015-04-13 14:37:22
【问题描述】:

我正在尝试从一维数组创建一个二维数组,以在 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 数组的索引,导致出现“超出边界”错误消息。关于如何管理这个的任何想法?

【问题讨论】:

  • @FlorianSchmidinger 是的,我认为是。请提醒我哪一部分不完整:)
  • @FlorianSchmidinger 非常感谢您的更正,当我问到这个问题时我很着急。
  • np 我们都时不时赶时间

标签: c# arrays multidimensional-array


【解决方案1】:

这应该是你想要的,它使用除法和模数来确定列和行(如果你想转动矩阵,只需将 "i % 4" 与 "i / 4" 切换):

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

【讨论】:

  • 我喜欢 [modulus,divide] 索引,看起来很漂亮。我正在为将来偷它:)
  • @HjalmarZ 不用偷...我给你...免费!
【解决方案2】:

您可能在State[column, row] = i; 上翻转了rowcolumn,这可能是导致您越界异常的原因。但是,如果没有有关您的变量的更多信息,就无法判断。

但这不是这里唯一的问题。假设您只想将数组分成四组。如果您翻转 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;
}

【讨论】:

  • @undip_student 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2012-03-08
  • 2011-05-28
  • 2011-04-18
  • 2018-11-20
相关资源
最近更新 更多