【问题标题】:Jagged Array VB.NET锯齿状数组 VB.NET
【发布时间】:2020-04-02 12:20:29
【问题描述】:

我正在尝试使用锯齿状数组来构建 AES 加密工具。这纯粹是为了帮助我了解加密的数学原理,而不是为了任何实际应用。我尝试使用 2D 数组,但无法弄清楚如何正确地遍历它们;所以我研究了锯齿状数组。我可以声明和初始化数据不变且不会改变的那些;但我也尝试遍历一个以向其中添加数据,但是在尝试添加到锯齿状数组时出现错误“对象引用未设置为对象的实例”。这是我的代码

Imports System.Text

Public Class Form1

    Dim sBox()() As String = {({"63", "7C", "77", "7B", "F2", "6B", "6F", "C5", "30", "01", "67", "2B", "FE", "D7", "AB", "76"}),
({"CA", "82", "C9", "7D", "FA", "59", "47", "F0", "AD", "D4", "A2", "AF", "9C", "A4", "72", "C0"}),
({"B7", "FD", "93", "26", "36", "3F", "F7", "CC", "34", "A5", "E5", "F1", "71", "D8", "31", "15"}),
({"04", "C7", "23", "C3", "18", "96", "05", "9A", "07", "12", "80", "E2", "EB", "27", "B2", "75"}),
({"09", "83", "2C", "1A", "1B", "6E", "5A", "A0", "52", "3B", "D6", "B3", "29", "E3", "2F", "84"}),
({"53", "D1", "00", "ED", "20", "FC", "B1", "5B", "6A", "CB", "BE", "39", "4A", "4C", "58", "CF"}),
({"D0", "EF", "AA", "FB", "43", "4D", "33", "85", "45", "F9", "02", "7F", "50", "3C", "9F", "A8"}),
({"51", "A3", "40", "8F", "92", "9D", "38", "F5", "BC", "B6", "DA", "21", "10", "FF", "F3", "D2"}),
({"CD", "0C", "13", "EC", "5F", "97", "44", "17", "C4", "A7", "7E", "3D", "64", "5D", "19", "73"}),
({"60", "81", "4F", "DC", "22", "2A", "90", "88", "46", "EE", "B8", "14", "DE", "5E", "0B", "DB"}),
({"E0", "32", "3A", "0A", "49", "06", "24", "5C", "C2", "D3", "AC", "62", "91", "95", "E4", "79"}),
({"E7", "C8", "37", "6D", "8D", "D5", "4E", "A9", "6C", "56", "F4", "EA", "65", "7A", "AE", "08"}),
({"BA", "78", "25", "2E", "1C", "A6", "B4", "C6", "E8", "DD", "74", "1F", "4B", "BD", "8B", "8A"}),
({"70", "3E", "B5", "66", "48", "03", "F6", "0E", "61", "35", "57", "B9", "86", "C1", "1D", "9E"}),
({"E1", "F8", "98", "11", "69", "D9", "8E", "94", "9B", "1E", "87", "E9", "CE", "55", "28", "DF"}),
({"8C", "A1", "89", "0D", "BF", "E6", "42", "68", "41", "99", "2D", "0F", "B0", "54", "BB", "16"})}
    Dim invSBox()() As String = {({"52", "09", "6A", "D5", "30", "36", "A5", "38", "BF", "40", "A3", "9E", "81", "F3", "D7", "FB"}),
({"7C", "E3", "39", "82", "9B", "2F", "FF", "87", "34", "8E", "43", "44", "C4", "DE", "E9", "CB"}),
({"54", "7B", "94", "32", "A6", "C2", "23", "3D", "EE", "4C", "95", "0B", "42", "FA", "C3", "4E"}),
({"08", "2E", "A1", "66", "28", "D9", "24", "B2", "76", "5B", "A2", "49", "6D", "8B", "D1", "25"}),
({"72", "F8", "F6", "64", "86", "68", "98", "16", "D4", "A4", "5C", "CC", "5D", "65", "B6", "92"}),
({"6C", "70", "48", "50", "FD", "ED", "B9", "DA", "5E", "15", "46", "57", "A7", "8D", "9D", "84"}),
({"90", "D8", "AB", "00", "8C", "BC", "D3", "0A", "F7", "E4", "58", "05", "B8", "B3", "45", "06"}),
({"D0", "2C", "1E", "8F", "CA", "3F", "0F", "02", "C1", "AF", "BD", "03", "01", "13", "8A", "6B"}),
({"3A", "91", "11", "41", "4F", "67", "DC", "EA", "97", "F2", "CF", "CE", "F0", "B4", "E6", "73"}),
({"96", "AC", "74", "22", "E7", "AD", "35", "85", "E2", "F9", "37", "E8", "1C", "75", "DF", "6E"}),
({"47", "F1", "1A", "71", "1D", "29", "C5", "89", "6F", "B7", "62", "0E", "AA", "18", "BE", "1B"}),
({"FC", "56", "3E", "4B", "C6", "D2", "79", "20", "9A", "DB", "C0", "FE", "78", "CD", "5A", "F4"}),
({"1F", "DD", "A8", "33", "88", "07", "C7", "31", "B1", "12", "10", "59", "27", "80", "EC", "5F"}),
({"60", "51", "7F", "A9", "19", "B5", "4A", "0D", "2D", "E5", "7A", "9F", "93", "C9", "9C", "EF"}),
({"A0", "E0", "3B", "4D", "AE", "2A", "F5", "B0", "C8", "EB", "BB", "3C", "83", "53", "99", "61"}),
({"17", "2B", "04", "7E", "BA", "77", "D6", "26", "E1", "69", "14", "63", "55", "21", "0C", "7D"})}
    Dim rci()() As String = {({"01", "02", "04", "08", "10", "20", "40", "80", "1B", "36"})}
    Dim cipherKey As String
    Dim newKey As New StringBuilder
    Dim istate()() As String
    Dim strVal As String
    Dim rnd As New Random
    Dim column As Integer
    Dim row As Integer

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        cipherKey = TextBox1.Text
        newKey.Clear()

        For i = 0 To 3
            For x = 0 To 3

                For Each c As Char In cipherKey
                    strVal = Convert.ToString(Convert.ToInt32(c), 16)

                    istate(i)(x) = strVal
                Next
            Next
        Next
    End Sub
End Class

我在istate(i)(x) = strVal这一行收到错误消息

我很欣赏我的代码可能效率不高,就像我说我只是尝试构建它并对 AES 的每个元素进行编程以更好地了解它的工作原理和数学原理

【问题讨论】:

  • 您不能添加到锯齿状数组或任何数组中。数组是固定大小的。您所能做的就是设置已经存在的元素。当然,该行会抛出NullReferenceException,因为您还没有创建任何数组。没有要设置的元素。首先了解数组的一般工作原理,然后将相同的原理扩展到多维和/或交错数组。
  • 如果您需要添加...考虑一个列表列表...如果第一个维度是固定的,则考虑一个列表数组

标签: arrays vb.net visual-studio-2015 aes


【解决方案1】:

所有数组都是固定大小的,无论是一维、多维还是锯齿状。如果你这样做:

Dim istate As String()

那么你还没有创建一个数组。您只是声明了一个可以引用数组的变量。如果您没有隐式或显式指定数组的大小,那么您还没有创建数组。这意味着任何通过该变量索引数组的尝试都将失败,因为没有数组。为了创建特定大小的数组,您必须指定上限,例如

Dim istate(3) As String

现在变量引用了一个包含四个元素的数组对象,因此您可以通过索引访问这些元素。对于二维数组,您必须指定两个维度的上限,例如

Dim istate(3, 3) As String

现在您有了一个包含四乘四元素的数组,您可以通过索引访问每个元素。锯齿状数组是一维数组的一维数组,因此您只能最初指定外部数组的大小,即该一维数组将包含多少个一维数组,例如

Dim istate(3)() As String

然后您必须创建每个内部数组,例如

For i = 0 To istate.GetUpperBound(0)
    istate(i) = New String(3) {}
Next

现在您可以通过索引访问每个内部数组的每个元素。

数组是引用类型的对象,因此数组变量的行为就像任何其他引用类型的变量一样,即对象不会凭空出现。您必须创建它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 2013-06-21
    • 2015-07-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多