将一维数组(变量类型)转换为一维数组(字节类型)



我试图避免以下代码中的循环

Sub Demo()
Dim v, en As ASCIIEncoding, myArr() As Byte, i As Long
Set en = New ASCIIEncoding
v = Array(89, 97, 115, 115, 101, 114)
ReDim myArr(0 To UBound(v))
For i = LBound(v) To UBound(v)
myArr(i) = v(i)
Next i
Debug.Print en.GetString(myArr)
End Sub

我使用循环将1d数组(变量v(转换为字节myArr。代码正在运行,但我正在努力寻找避免使用循环的方法。

答案是否定的,您不能只将Variant Array分配给Byte Array而不使用循环。顾名思义,一个字节在内存中占据1个字节,而持有一个字节的变体将是16个字节(x32(或24个字节(x64(。SAFEARRAY(在COM中保持数组的结构(中的对齐将不允许简单的内存复制。更不用说Variant可以保存字节0-255范围之外的值。

我建议使用一个辅助功能来实现您的目标:

Public Function ArrayByte(ParamArray values() As Variant) As Byte()
Dim b() As Byte
Dim v As Variant
Dim i As Long
'
ReDim b(LBound(values) To UBound(values))
i = LBound(b)
For Each v In values
b(i) = CByte(v) 'This can throw an error. You might want to implement some checks in order to raise a custom error
i = i + 1
Next v
ArrayByte = b
End Function

这样,你的代码就会变成:

Sub Demo()
Dim en As ASCIIEncoding
Dim myArr() As Byte
Set en = New ASCIIEncoding
myArr = ArrayByte(89, 97, 115, 115, 101, 114)
Debug.Print en.GetString(myArr)
End Sub

相关内容

  • 没有找到相关文章

最新更新