【问题标题】:BitConverter.ToInt64 OverflowExceptionBitConverter.ToInt64 溢出异常
【发布时间】:2016-11-19 11:15:49
【问题描述】:

我在第一步 (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

【问题讨论】:

  • 你确定不是ArgumentException
  • 将 Option Strict On 放在源代码文件的顶部,让编译器帮助您发现错误的原因。引发此异常的不是 BitConverter。从负 Int64 到 UInt64 的转换是无效的。请改用 BitConverter.ToUInt64()。或者你可能想要 List(Of Int64),意图很难猜。
  • 谢谢汉斯..是的,现在工作..

标签: .net vb.net bitconverter


【解决方案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
    

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多