3

初めて vb 6.0 アプリケーションを開発しているときに、サイズ (164999) の巨大なバイト配列を VB 6.0 の 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 配列に変換するか、これらのバイト配列を保存するための代替方法を実行するために必要なこと

4

1 に答える 1

4

バイト配列内の 32 ビット データのレイアウトによっては、1 つの配列から別の配列にメモリを直接コピーできます。

これは、データがリトル エンディアンの場合にのみ機能します (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 より大きい場合に壊れます。)

于 2013-06-05T10:49:25.527 に答える