如何在一行中将多个值分配给字节数组 (Visual Basic 6.0)

How to assign several values to Byte array in one line (Visual Basic 6.0)

我正在处理旧的 Visual Basic 6.0 项目。我对Visual Basic 略有了解,但仍然感觉不到VB6.0 和.Net 之间的区别。

我尝试做的事情:

Private sbox() As Byte = {&H63, &H7C, &H77, ... , &H7B}

但是VB6.0报错:Unknown symbol (about { bracket) 我只能做

Private sbox() As Byte
sbox = &H63

sbox(0) = &H63

但是这里是255个值!我可以像在 .NET 中那样在一行中分配它,还是只需要这样做:

sbox(0) = &H63
sbox(1) = &H7C
' ... 253 lines of the same code
sbox(255) = &H00

VB6/VBA中没有数组初始化语法。

根据您的需要,您可以:

使用 Array() - 但是这将 return 一个 变量数组 :

Dim sbox() As Variant: sbox = Array(&H63, &H7C, &H77, ..., &H7B)

使用一个帮助程序return一个强类型数组:

Dim sbox() As Byte: sbox = ByteArray(&H63, &H7C, &H77, ..., &H7B)
 ...
Private Function ByteArray(ParamArray values() As Variant) As Byte()
    ReDim bytes(UBound(values)) As Byte
    Dim i As Long
    For i = 0 To UBound(values)
        bytes(i) = values(i)
    Next
    ByteArray = bytes
End Function

将原始字节转储到一个文件中,将该文件作为自定义资源(.res/resource 加载项)包括在内,从那时起:

Dim sbox() As Byte: sbox = LoadResData(101, "SBOX_VALS")

不错。我只想补充一点,当我要输入一长串重复的编程语句时,我通常会创建一个简单的电子表格来自动生成这些行。

即,在 Excel 中,将您的值放在 A 列中,然后在 B 列中放入 =CONCATENATE(...) 语句以组成 VB6 代码。最后,copy/paste 作为文本进入您的 IDE。

有很多方法可以为这只猫制作皮肤,但对于大型字节数组,自定义资源可能更有意义。这是一个例子:

Option Explicit

Private Const WIN32_NULL As Long = 0
Private Const WIN32_FALSE As Long = 0

Private Enum CS_FLAGS
    CRYPT_STRING_HEX = &H4&
End Enum

Private Declare Function CryptStringToBinary Lib "Crypt32" _
    Alias "CryptStringToBinaryW" ( _
    ByVal pszString As Long, _
    ByVal cchString As Long, _
    ByVal dwFlags As CS_FLAGS, _
    ByVal pbBinary As Long, _
    ByRef cbBinary As Long, _
    ByVal pdwSkip As Long, _
    ByRef dwFlagsActual As CS_FLAGS) As Long

Private Sub HexToBytes(ByRef HexData As String, ByRef Bytes() As Byte)
    Dim OutLen As Long
    Dim dwActualUsed As CS_FLAGS

    OutLen = UBound(Bytes) - LBound(Bytes) + 1
    If CryptStringToBinary(StrPtr(HexData), _
                           Len(HexData), _
                           CRYPT_STRING_HEX, _
                           VarPtr(Bytes(LBound(Bytes))), _
                           OutLen, _
                           WIN32_NULL, _
                           dwActualUsed) = WIN32_FALSE Then
        Err.Raise &H8004A700, _
                  "HexToBytes", _
                  "CryptStringToBinary failed, error " & CStr(Err.LastDllError)
    End If
End Sub

Private Sub Form_Load()
    Const EXAMPLE_ONE As String = "41 42 43 44 45 46 47 48"
    Const EXAMPLE_TWO As String = _
        "4C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E73" _
      & "656374657475720D0A61646970697363696E6720656C69742E20557420696E20" _
      & "75726E6120677261766964612C0D0A68656E647265726974206D69206E6F6E2C" _
      & "20666163696C6973697320616E74652E0D0A0D0A41656E65616E20616320656E" _
      & "696D2074656D7075732C206C6163696E69612070757275730D0A717569732C20" _
      & "766F6C75747061742076656C69742E2053757370656E64697373652071756973" _
      & "0D0A636F6D6D6F646F206E6962682E204E616D206574206C696265726F206575" _
      & "206C65637475730D0A73616769747469732072686F6E6375732E2E2E2E2E2E21"
    Dim One(1 To 8) As Byte
    Dim Two(0 To 255) As Byte

    AutoRedraw = True

    HexToBytes EXAMPLE_ONE, One
    Print UBound(One) - LBound(One) + 1; ":"
    Print StrConv(One, vbUnicode)

    HexToBytes EXAMPLE_TWO, Two
    Print UBound(Two) - LBound(Two) + 1; ":"
    Print StrConv(Two, vbUnicode)
End Sub

我找到了解决此任务的另一种方法:

Private sbox() As Byte
ReDim sbox(255)

Dim i As Integer
 For i = 0 To 255
  sbox(i) = Choose(i + 1, &H63, &H7C, _
            ..., &H00)
 Next

这里有两个有趣的时刻:

  1. 我们仍然需要知道实际的数组大小:如您所见,我使用了 255 in 几行
  2. 使用_将这个语句写成几行是个好点:例如,我用十六进制的16个值在一行中写数据,所以现在很容易阅读。