2016-11-19 55 views
0

我在第一步(i = 0)出現「OverflowException」錯誤。這段代碼有什麼問題?BitConverter.ToInt64 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 
+0

你確定這不是'ArgumentException'? – dasblinkenlight

+1

http://stackoverflow.com/questions/9804265/how-does-bitconverter-toint64-handles-a-byte-arry-with-32-bytes-a-256-bit-hash –

+1

把選項嚴格打開在頂部的源代碼文件,讓編譯器幫助你發現爲什麼這是錯誤的。這不是BitConverter引發此異常。它是從Int64到UInt64的無效轉換。改用BitConverter.ToUInt64()。或者,也許你想List(Of Int64),意圖很難猜測。 –

回答

1

您的代碼中有兩個錯誤。

  1. 你讓BitConverter轉換您的字節Int64值,試圖插入到UInt64集合。這可能會導致OverflowException,因爲UInt64不能表示負值。

    您需要匹配的是什麼BitConverter與你的列表存儲產生的類型,所以做以下(這兩個不能同時!)之一:

    • 更換BitConverter.ToInt64(…)BitConverter.ToUInt64(…)
    • 聲明Dim UintList As New List(Of Int64)而不是List(Of UInt64)
  2. 你的陣列具有長度(75個字節),其通過8是不能整除,這將在最後循環迭代引起ArgumentExceptionBitConverter.ToInt64預計從指定的起始偏移量i將至少有8個字節可用。但是,一旦偏移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 
    
+0

非常感謝..現在工作時,ToUInt64與ToUInt64 .. –

相關問題