2009-03-13 68 views
11

Tôi cần chuyển đổi hex thành số thập phân trong VB.NET. Tìm thấy một số ví dụ trong C#, nhưng khi tôi cố gắng chuyển đổi sang VB.NET tôi đã không thành công. Ví dụ về số thập lục phân mà tôi đang cố chuyển đổi là "A14152464C203230304232323020572F544947455234352E".Làm cách nào để chuyển đổi hex sang thập phân bằng VB.NET?

+0

số gì là bạn mong đợi? Đó là 192 bit ... lớn hơn nhiều so với hầu hết các loại sẵn có ... –

+0

(lưu ý tôi đã thêm một bình luận trả lời câu hỏi của bạn) –

Trả lời

6

Đó là số 24 byte (192 bit); bạn mong đợi giá trị nào?

Lưu ý rằng bạn có thể sử dụng Convert để làm rất nhiều công việc grungy đây - ví dụ (trong C#):

string hex = "A14152464C203230304232323020572F544947455234352E"; 
    byte[] raw = new byte[hex.Length/2]; 
    for (int i = 0; i < raw.Length ; i++) 
    { 
     raw[i] = Convert.ToByte(hex.Substring(i * 2,2), 16); 
    } 

Làm thế nào bạn nhận được từ raw đối với một số phụ thuộc vào những gì bạn nghĩ con số này ...

Visual Basic dịch biếu không của .NET Reflector (mặc dù "-1" trông lẻ):

Dim hex As String = "A14152464C203230304232323020572F544947455234352E" 
Dim raw As Byte() = New Byte((hex.Length/2) - 1) {} 
Dim i As Integer 
For i = 0 To raw.Length - 1 
    raw(i) = Convert.ToByte(hex.Substring((i * 2), 2), &H10) 
Next i 
+0

Tôi không biết số lượng nên là gì. Lockhead Martin mới bắt đầu chuyển dữ liệu này và họ chưa hoàn tất tài liệu. Chúng ta đang ở trong một chế độ khám phá vào lúc này. Tôi có nên tổng hợp các giá trị thô (i) để lấy số không? – user38349

+0

Không; đó sẽ là xấu ... vấn đề là: phải làm gì với 192 bit?đó có thể là 3 longs (Int64), 6 ints (Int32), 2 thập phân, một BigInteger, v.v ... nhưng nó là big-endian, little-endian, vv ... giải mã nhị phân cần một chút * chút kiến ​​thức về nguồn. –

+0

-1 là chính xác, cú pháp khai báo mảng VB cho giới hạn trên của mảng trong khi C# cho số lượng các mục trong mảng. Vì mảng là 0 dựa trên giới hạn trên là một ít hơn số lượng các mục. – MarkJ

1

Viết một mình.

Bạn sẽ cần phải mã hóa chuỗi, sau đó bắt đầu từ bên phải và làm việc theo cách của bạn sang trái.

int weight = 1; 
While Looping 
{ 

    If (token(i) == "F") { DecimalValue += 15 * weight; } 
    If (token(i) == "E") { DecimalValue += 14 * weight; } 
    If (token(i) == "D") { DecimalValue += 13 * weight; } 
    If (token(i) == "C") { DecimalValue += 12 * weight; } 
    If (token(i) == "B") { DecimalValue += 11 * weight; } 
    If (token(i) == "A") { DecimalValue += 10 * weight; } 
    else { DecimalValue += token(i) * weight; } 

    weight = weight * 16; 
} 

Điều gì đó tương tự.

1
Dim hex As String 
    hex = "A14152464C203230304232323020572F544947455234352E" 

    Dim dec As Long 
    Dim hexpart As String 
    For x As Integer = 1 To (hex.Length/2) 

     hexpart = hex.Substring((x * 2) - 2, 2) 
     dec = Int32.Parse(hexpart, System.Globalization.NumberStyles.HexNumber) 

     Debug.Print("Hex = " + hex + ",HexPart = " + hexpart + ", Dec = " + dec.ToString + Environment.NewLine) 
    Next 

Điều này sẽ không hoạt động đối với thập phân và Hex quá dài đối với số nguyên ... nhưng bạn có ý tưởng. Bạn có thể chia nó và tái kết hợp.

Hex = A14152464C203230304232323020572F544947455234352E,HexPart = A1, Dec = 161 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 41, Dec = 65 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 52, Dec = 82 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 46, Dec = 70 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 4C, Dec = 76 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 20, Dec = 32 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 32, Dec = 50 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 30, Dec = 48 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 30, Dec = 48 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 42, Dec = 66 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 32, Dec = 50 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 32, Dec = 50 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 30, Dec = 48 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 20, Dec = 32 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 57, Dec = 87 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 2F, Dec = 47 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 54, Dec = 84 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 49, Dec = 73 
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 47, Dec = 71 
0

này sẽ chuyển đổi của bạn Tring vào một mảng byte:

Dim hex As String = "A14152464C203230304232323020572F544947455234352E" 

Dim len As Integer = hex.Length \ 2 
Dim data(len - 1) As Byte 
For i As Integer = 0 to len - 1 
    data(i) = Convert.ToByte(hex.Substring(i * 2, 2), 16) 
Next 
1
Private Function toByte(ByVal Shex As String) As List(Of Byte) 
    Const cvtCH As Integer = 2 
    Dim retval As New List(Of Byte) 
    Dim rmndr As Integer 
    rmndr = Shex.Length Mod cvtCH 
    If rmndr <> 0 Then Shex = Shex.PadLeft(Shex.Length + cvtCH - rmndr, "0"c) 
    For x As Integer = 0 To Shex.Length - 1 Step cvtCH 
     retval.Add(Convert.ToByte(Shex.Substring(x, cvtCH), 16)) 
    Next 
    Return retval 
End Function 
Private Function toU32(ByVal Shex As String) As List(Of UInt32) 
    Const cvtCH As Integer = 8 
    Dim retval As New List(Of UInt32) 
    Dim rmndr As Integer 
    rmndr = Shex.Length Mod cvtCH 
    If rmndr <> 0 Then Shex = Shex.PadLeft(Shex.Length + cvtCH - rmndr, "0"c) 
    For x As Integer = 0 To Shex.Length - 1 Step cvtCH 
     retval.Add(Convert.ToUInt32(Shex.Substring(x, cvtCH), 16)) 
    Next 
    Return retval 
End Function 
Private Function toU64(ByVal Shex As String) As List(Of UInt64) 
    Const cvtCH As Integer = 16 
    Dim retval As New List(Of UInt64) 
    Dim rmndr As Integer 
    rmndr = Shex.Length Mod cvtCH 
    If rmndr <> 0 Then Shex = Shex.PadLeft(Shex.Length + cvtCH - rmndr, "0"c) 
    For x As Integer = 0 To Shex.Length - 1 Step cvtCH 
     retval.Add(Convert.ToUInt64(Shex.Substring(x, cvtCH), 16)) 
    Next 
    Return retval 
End Function 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    'unsigned 32 bit max = FFFFFFFF 
    'unsigned 64 bit max = FFFFFFFF 
    'signed 32 bit max = 7FFFFFFF 
    'signed 64 bit max = 7FFFFFFF 
    Dim hexS As String = "A14152464C203230304232323020572F544947455234352E" 
    Dim hexS2 As String = "A14152464C203230304232323020572F54494745523435" 
    toByte(hexS) 
    toU32(hexS) 
    toU64(hexS) 
End Sub 
15

Đối với các giá trị hex mà không thực sự đòi hỏi một lớp bignum để làm việc với, bạn có thể sử dụng chức năng chuyển đổi bình thường nhưng tiền tố số với "& H". VB giải thích "& H" trong văn bản có nghĩa là "đây là số hex", giống như trong mã.

dim n = Cint("&H" & text) 
4

Bạn có thể sử dụng chức năng Val trong Visual Basic để chuyển đổi một giá trị thập lục phân đến một giá trị thập phân. Điều này được thực hiện bằng cách đặt trước chuỗi với "&H", để cho Visual Basic biết rằng đây là giá trị thập lục phân, sau đó chuyển đổi thành một số.

Dim Value As Integer = Val("&H" & YourHexadecimalStringHere) 
0
Dim hex As String = "A1B2C3D4" 
Dim int As Integer = Val("&H" & hex) 
0

Cố gắng trả lời những người khác và đây là một trong đó làm việc cho tôi:

Convert.ToInt32(yourHEXString, 16) 

Documentation

Các vấn đề liên quan