2017-05-10 7 views
0

안녕하세요?VB .NET에서 BigInteger로 이진 파싱 하시겠습니까?

큰 바이너리 체인 (문자열 변수)을 조작하는 프로그램을 작성했습니다. 이 조작은 내 체인을 변수에 저장해야하므로 숫자로 사용할 수 있습니다. 그러한 긴 숫자를 저장하기에 충분히 큰 것으로 밝혀진 유일한 변수 유형은 BigInteger (우리는 1.0E100 +를 말하고 있습니다)입니다.

val = BigInteger.Parse(bin, 2) 

그러나 필요한 두 번째 매개 변수 만 NumberStyles.HexNumber 참조 할 수 NumberStyles 개체입니다 :

나는 같은 것을 사용하고 싶습니다.

이 작업을 수행하는 간단하고 최적의 방법이 있습니까?

당신에게 대단히 감사합니다. :)

+0

BitArray를 사용할 수 없습니까? –

+0

무슨 목적으로? – user7831458

+0

큰 바이너리 체인 용 : –

답변

0

이진 문자열을 8 비트 청크로 BigInteger로 변환합니다. 이진 문자열은 양수를 나타내는 것으로 가정합니다.

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")) 

이 테스트

에 대한

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 

잘 테스트되지 않았습니다하지만 당신에게 몇 가지 아이디어를 제공해야합니다.

+0

정말 고마워요. 매력처럼 작동합니다. 그래서 바이너리 문자열을 BigInteger로 파싱 할 방법이 없다는 것을 이해합니다. – user7831458