我试图避免以下代码中的循环
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
我使用循环来转换一维数组,它是 Variant v
至字节 myArr
.该代码正在运行,但我正在尝试寻找一种避免使用循环的方法。
最佳答案
答案是否定的,您不能只将变体数组分配给字节数组而不使用循环。顾名思义,一个 Byte 在内存中占用 1 个字节,而持有一个 Byte 的 Variant 将占用 16 个字节 (x32) 或 24 个字节 (x64)。 SAFEARRAY(在 COM 中保存数组的结构)中的对齐将不允许简单的内存复制。更不用说 Variant 可以保存 Byte 的 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
关于excel - 将一维数组(变体类型)转换为一维数组(字节类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64614027/