如何在一行中将多个值分配给字节数组 (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
这里有两个有趣的时刻:
- 我们仍然需要知道实际的数组大小:如您所见,我使用了 255
in
几行
- 使用
_
将这个语句写成几行是个好点:例如,我用十六进制的16个值在一行中写数据,所以现在很容易阅读。
我正在处理旧的 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
这里有两个有趣的时刻:
- 我们仍然需要知道实际的数组大小:如您所见,我使用了 255
in
几行 - 使用
_
将这个语句写成几行是个好点:例如,我用十六进制的16个值在一行中写数据,所以现在很容易阅读。