将巨大的字节数组转换为Long数组会引发溢出异常

时间:2013-06-05 07:59:54

标签: vb6 bytearray

我第一次开发vb 6.0应用程序 我试图在VB 6.0中将大小的字节数组(164999)转换为Long / Integer数组,但它给我一个溢出错误。

我的代码

Dim tempByteData() As Byte // of size (164999)
Dim lCount As Long

Private Sub Open()
    lCount = 164999 **//here I get the count i.e. 164999**                     
    ReDim tempByteData(lCount - 1)
    For x = 0 To obj.BinaryValueCount - 1
        tempwaveformData(x) = CByte(obj.BinaryValues(x))
    Next
    tempByteData(lCount - 1) = BArrayToInt(tempByteData)   
End Sub

Private Function BArrayToInt(ByRef bArray() As Byte) As Long
    Dim iReturn() As Long
    Dim i As Long

    ReDim iReturn(UBound(bArray) - 1)
    For i = 0 To UBound(bArray) - LBound(bArray)
        iReturn(i) = iReturn(i) + bArray(i) * 2 ^ i
    Next i

    BArrayToInt = iReturn(i)

End Function

需要做什么才能将所有字节数组数据转换为Long / Integer数组或以其他任何方式存储这些字节数组,以便不会发生溢出异常

1 个答案:

答案 0 :(得分:4)

根据字节数组中32位数据的布局,您可以从一个数组到另一个数组执行直接内存复制。

这仅在数据为小端时才起作用(Win32应用程序/数据正常,但并不总是保证)

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Function ByteArrayToLongArray(ByRef ByteArray() As Byte) As Long()
Dim LongArray() As Long
Dim Index As Long

  'Create a Long array big enough to hold the data in the byte array
  'This assumes its length is a multiple of 4.
  ReDim LongArray(((UBound(ByteArray) - LBound(ByteArray) + 1) / 4) - 1)

  'Copy the data wholesale from one array to another
  CopyMemory LongArray(LBound(LongArray)), ByteArray(LBound(ByteArray)), UBound(ByteArray) + 1

  'Return the resulting array
  ByteArrayToLongArray = LongArray
End Function

如果数据是大端,那么您需要一次转换每个字节:

Private Function ByteArrayToLongArray(ByRef ByteArray() As Byte) As Long()
Dim LongArray() As Long
Dim Index As Long

  'Create a Long array big enough to hold the data in the byte array
  'This assumes its length is a multiple of 4.
  ReDim LongArray(((UBound(ByteArray) - LBound(ByteArray) + 1) / 4) - 1)

  'Copy each 4 bytes into the Long array
  For Index = LBound(ByteArray) To UBound(ByteArray) Step 4
    'Little endian conversion
    'LongArray(Index / 4) = (ByteArray(Index + 3) * &H1000000&) Or (ByteArray(Index + 2) * &H10000&) Or (ByteArray(Index + 1) * &H100&) Or (ByteArray(Index))
    'Big endian conversion
    LongArray(Index / 4) = (ByteArray(Index) * &H1000000&) Or (ByteArray(Index + 1) * &H10000&) Or (ByteArray(Index + 2) * &H100&) Or (ByteArray(Index + 3))
  Next

  'Return the resulting array
  ByteArrayToLongArray = LongArray
End Function

(如果每个四边形的第一个字节大于127表示负数,则此示例当前会中断。)