在 VB .NET 中将二进制文件解析为 BigInteger?
Parsing binary to BigInteger in VB .NET?
你好吗?
我写了一个程序来处理大二进制链(字符串变量)。这表示操作要求我将我的链存储在一个变量中,以便我可以将它们用作数字。我发现唯一大到足以存储如此长的数字的变量类型是 BigInteger(我们说的是 1.0E100+)。
我想使用类似的东西:
val = BigInteger.Parse(bin, 2)
但是需要的第二个参数是一个NumberStyles对象,只能引用一个NumberStyles.HexNumber.
有simple/optimal方法吗?
非常感谢。 :)
这会将二进制字符串转换为 8 位块中的 BigInteger。它假定二进制字符串代表一个正数。
Private Function BinToBI(ByRef binstr As String) As BigInteger
Dim t As New List(Of Byte)
Dim s As String
Dim idx As Integer = binstr.Length
Do While idx > 0
'get 8 bits
If idx >= 8 Then
s = binstr.Substring(idx - 8, 8)
Else
s = binstr.Substring(0, idx).PadLeft(8, "0"c)
End If
'convert to byte and add to list
Dim b As Byte = Convert.ToByte(s, 2)
t.Add(b)
idx -= 8
Loop
'force to positive
If t(t.Count - 1) >= 128 Then
t.Add(0)
End If
Dim rv As New BigInteger(t.ToArray)
Return rv
End Function
用于测试
Dim d As Double = 1.0E+101
Debug.WriteLine(d.ToString("n2"))
Dim bi As BigInteger
' Dim bin As String = "1111111111111111111111111111111" 'Integer.MaxValue
' Dim bin As String = "111111111111111111111111111111111111111111111111111111111111111" 'Long.MaxValue
Dim bin As String = "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110"
bi = BinToBI(bin)
Debug.WriteLine(bi.ToString("n2"))
这没有经过很好的测试,但应该会给你一些想法。
你好吗?
我写了一个程序来处理大二进制链(字符串变量)。这表示操作要求我将我的链存储在一个变量中,以便我可以将它们用作数字。我发现唯一大到足以存储如此长的数字的变量类型是 BigInteger(我们说的是 1.0E100+)。
我想使用类似的东西:
val = BigInteger.Parse(bin, 2)
但是需要的第二个参数是一个NumberStyles对象,只能引用一个NumberStyles.HexNumber.
有simple/optimal方法吗?
非常感谢。 :)
这会将二进制字符串转换为 8 位块中的 BigInteger。它假定二进制字符串代表一个正数。
Private Function BinToBI(ByRef binstr As String) As BigInteger
Dim t As New List(Of Byte)
Dim s As String
Dim idx As Integer = binstr.Length
Do While idx > 0
'get 8 bits
If idx >= 8 Then
s = binstr.Substring(idx - 8, 8)
Else
s = binstr.Substring(0, idx).PadLeft(8, "0"c)
End If
'convert to byte and add to list
Dim b As Byte = Convert.ToByte(s, 2)
t.Add(b)
idx -= 8
Loop
'force to positive
If t(t.Count - 1) >= 128 Then
t.Add(0)
End If
Dim rv As New BigInteger(t.ToArray)
Return rv
End Function
用于测试
Dim d As Double = 1.0E+101
Debug.WriteLine(d.ToString("n2"))
Dim bi As BigInteger
' Dim bin As String = "1111111111111111111111111111111" 'Integer.MaxValue
' Dim bin As String = "111111111111111111111111111111111111111111111111111111111111111" 'Long.MaxValue
Dim bin As String = "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110"
bi = BinToBI(bin)
Debug.WriteLine(bi.ToString("n2"))
这没有经过很好的测试,但应该会给你一些想法。