【问题标题】:hex to numeric code works fine with small numbers but largenumbers produce errors十六进制数字代码适用于小数字,但大数字会产生错误
【发布时间】:2016-06-22 10:46:15
【问题描述】:

以下代码将hex string 转换为numeric 值,并且它适用于较小的十六进制数字,例如1f。但是,它不适用于像"000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"这样的大数字,因为 int32 不能有那么大/小的数字。但是应该有另一种绕过这些限制的方法吗?有人可以在这里阐明一下吗,或者欢迎任何搜索关键字通过谷歌等搜索,因为我找不到任何转换大十六进制数字的方法。

Public Class Form1

    Dim data As String = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"
    Dim result1 As String = Nothing


    Public Function hexToNumeric(ByVal inputHexstring As String)
        Dim val As Integer

        val = Convert.ToInt32(inputHexstring, 16)
        Return val
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        result1 = hexToNumeric(data)
    End Sub
End Class

【问题讨论】:

  • 总是会有一个限制。您可以使用Int64,但最大值仍然是9,223,372,036,854,775,807;也就是说,十六进制 0x7FFFFFFFFFFFFFFF 所以它不会有什么帮助 - 如果你可以将它转换为整数,你到底打算如何处理这个巨大的数字?
  • @MattWilko :我正在尝试将这个 python 代码 Result1 = data.decode('hex')[::-1] 的功能模仿为 vb.net 代码。据我所知,该代码解码data 变量中的hex string,然后反转bits。所以,我首先尝试在 vb.net 中编码以将 hex string 解码为 numeric,然后我将反转 bits
  • 我不明白的是python 可以解码巨大的十六进制数字而vb.net 不能解码超过int64

标签: .net vb.net hex integer-overflow


【解决方案1】:

您应该查看 BigInteger 结构,请参阅 https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

您可以将字节数组转换为 BigInteger,但请注意以下几点:“BigInteger 结构要求字节数组中的各个字节以小端顺序出现(即值在高位字节之前)。”

【讨论】:

  • 我什至无法测试它,因为 imports System.Numeric 命名空间在我的 VisualStudio 2012 中不是有效的命名空间。我只有 System.Nullable System.nullable(ofT)System.NullReferenceException 以字母 N 开头
  • 您需要 .Net Framework 4.5 或 4.6 并在您的项目中添加参考。
  • @Andrew : 我在测试时已经在代码中添加了命名空间......以及如何检查我的是否是.net framework 4.5?
  • 检查 .Net 版本的最简单方法是从 Visual Studio 命令提示符输入 clrver。此外,在代码中添加命名空间是使用程序集的一部分,您还需要显示程序集的来源。这是通过为您的项目设置新的引用来完成的。
  • @andrew :现在它已成功添加为引用,现在命名空间在项目中可用,但是当我尝试执行时它仍然抛出异常。 Dim val As BigInteger val = Convert.ToInt32(inputHexstring, 16) - Value was either too large or too small for a UInt32.
【解决方案2】:

您可以使用 BigInteger 和 Parse 来复制示例中的功能。

Imports System.Numerics

Public Shared Function hexToNumeric(ByVal inputHexstring As String) As BigInteger
    Dim val As BigInteger

    val = BigInteger.Parse(inputHexstring, Globalization.NumberStyles.AllowHexSpecifier)

    Return val
End Function

Public Shared Sub Main()
    Dim data As String = "000000000000000117c80378b8da0e33559b5997f2ad55e2f7d18ec1975b9717"

    Console.WriteLine(hexToNumeric(data))
    Console.ReadLine()
End Sub

结果是

6860217587554922525607992740653361396256930700588249487127

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多