Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 十六进制到数字的代码适用于小数字,但大数字会产生错误_.net_Vb.net_Hex_Integer Overflow - Fatal编程技术网

.net 十六进制到数字的代码适用于小数字,但大数字会产生错误

.net 十六进制到数字的代码适用于小数字,但大数字会产生错误,.net,vb.net,hex,integer-overflow,.net,Vb.net,Hex,Integer Overflow,下面的代码将十六进制字符串转换为数值值,它可以很好地处理小的十六进制数,例如1f。但是,它不适用于较大的数字,例如“000000000000000 117C80378B8DA0E33559B5997F2AD55E2F7D18EC1975B9717”,因为int32的数字不能太大/太小。但应该有另一种方法绕过这些限制,对吗?有人可以在这里透露一些信息,或者任何搜索关键字都欢迎通过谷歌等搜索,因为我找不到任何方法来转换大十六进制数 Public Class Form1 Dim data A

下面的代码将
十六进制字符串
转换为
数值
值,它可以很好地处理小的十六进制数,例如
1f
。但是,它不适用于较大的数字,例如
“000000000000000 117C80378B8DA0E33559B5997F2AD55E2F7D18EC1975B9717”
,因为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

您应该查看BigInteger结构,请参见


您可以从字节数组转换为BigInteger,但要注意以下几点:“BigInteger结构要求字节数组中的各个字节以小尾数顺序出现(即,值的低阶字节先于高阶字节)。”

您可以使用
biginger
和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

总有一个极限。您可以使用
Int64
,但最大值仍然是
9223372036854775807
;也就是说,十六进制
0x7fffffffffffffffff
所以它不会真的有帮助-如果你能将这个庞大的数字转换成整数,你到底打算怎么处理它?@MattWilko:我试图模仿这个python代码
Result1=data.decode('hex')[:-1]
到vb.net代码。据我所知,该代码对
数据
变量中的
十六进制字符串
进行解码,然后反转
。所以我首先尝试在vb.net中编写代码,将
十六进制字符串
解码为
数字
,然后我将反转
。我不明白的是
python
可以解码巨大的十六进制数,
vb.net
不能解码超过
int64
?可能的重复我甚至无法在导入
时测试它System.Numeric
命名空间在my 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 biginger
val=Convert.ToInt32(inputexstring,16)
-
值对于UInt32太大或太小。