0

最初のステップ (i=0) で「OverflowException」というエラーが発生しました。このコードのどこが間違っていますか?

    Dim byteArray As Byte() = { _
          0, 54, 101, 196, 255, 255, 255, 255, 0, 0, _
          0, 0, 0, 0, 0, 0, 128, 0, 202, 154, _
         59, 0, 0, 0, 0, 1, 0, 0, 0, 0, _
        255, 255, 255, 255, 1, 0, 0, 255, 255, 255, _
        255, 255, 255, 255, 127, 86, 85, 85, 85, 85, _
         85, 255, 255, 170, 170, 170, 170, 170, 170, 0, _
          0, 100, 167, 179, 182, 224, 13, 0, 0, 156, _
         88, 76, 73, 31, 242}

    Dim UintList As New List(Of UInt64)  
    For i As Integer = 0 To byteArray.Count - 1 Step 8 
        UintList.Add(BitConverter.ToInt64(byteArray, i))
    Next
4

1 に答える 1

2

コードに 2 つのエラーがあります。

  1. BitConverterバイトを値に変換し、それをコレクションInt64に挿入しようとします。は負の値を表すことができないため、UInt64これにより が発生する可能性があります。OverflowExceptionUInt64

    生成されるもののタイプとリストに保存されるもののタイプを一致させる必要があるBitConverterため、次のいずれかを実行します (両方ではありません!):

    • に置き換えBitConverter.ToInt64(…)ますBitConverter.ToUInt64(…)
    • Dim UintList As New List(Of Int64)as の代わりに宣言しList(Of UInt64)ます。
  2. 配列の長さ (75 バイト) は 8 で割り切れないためArgumentException、最後のループ反復で発生します。BitConverter.ToInt64は、指定された開始オフセットから少なくとも 8 バイトが利用できると想定していますi。ただし、オフセット 72 に達すると、4 バイトしか残っていないため、Int64.

    したがって、変換するのに十分なバイトが残っているかどうかを確認する必要があります。

    For i As Integer = 0 To byteArray.Count - 1 Step 8 
        If i + 8 <= byteArray.Length Then
            … ' enough bytes available to convert to a 64-bit integer
        Else
            … ' not enough bytes left to convert to a 64-bit integer
        End
    Next
    
于 2016-11-19T13:19:29.470 に答える