2009-04-07 52 views
23

Tôi cần kiểm tra số string nằm bên trong gói mà tôi nhận được dưới dạng mảng byte. Nếu tôi sử dụng BitConverter.ToString(), tôi nhận được các byte là string với dấu gạch ngang (ví dụ: 00-50-25-40-A5-FF).
Tôi đã thử hầu hết các chức năng mà tôi tìm thấy sau khi googling nhanh, nhưng hầu hết trong số chúng có kiểu tham số đầu vào string và nếu tôi gọi chúng là string với dấu gạch ngang, Nó sẽ ném ngoại lệ.Chuyển đổi từ hex thành chuỗi

Tôi cần hàm có chức năng hex (như string hoặc là byte) vào số string đại diện cho giá trị thập lục phân (ví dụ: 0x31 = 1). Nếu tham số đầu vào là string, hàm sẽ nhận dạng dấu gạch ngang (ví dụ: "47-61-74-65-77-61-79-53-65-72-76-65-72"), vì BitConverter không chuyển đổi chính xác .

+0

Tại sao không chỉ loại bỏ các dấu gạch ngang ? –

+0

Tôi đã tìm thấy một phương pháp hay tại Mã đánh giá: http://codereview.stackexchange.com/questions/97950/conversion-of-hexadecimal-string-to-string – Breeze

Trả lời

48

Như vậy?

static void Main() 
{ 
    byte[] data = FromHex("47-61-74-65-77-61-79-53-65-72-76-65-72"); 
    string s = Encoding.ASCII.GetString(data); // GatewayServer 
} 
public static byte[] FromHex(string hex) 
{ 
    hex = hex.Replace("-", ""); 
    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); 
    } 
    return raw; 
} 
+0

@Ian - huh? Đó là giá trị của "s" ... –

+0

@ Marc, Cảm ơn! @ lan, Đó là mảng byte tôi đã đưa ra trong câu hỏi của tôi, Marc là cảm ơn nhiều hơn cho việc kiểm tra nó như là chuỗi. :) –

+0

@Marc, yeah yeah .. Tôi nhận thấy rằng .. erm .. (ẩn dưới bàn) –

7
string str = "47-61-74-65-77-61-79-53-65-72-76-65-72"; 
string[] parts = str.Split('-'); 

foreach (string val in parts) 
{ 
    int x; 
    if (int.TryParse(val, out x)) 
    { 
     Console.Write(string.Format("{0:x2} ", x); 
    } 
} 
Console.WriteLine(); 

Bạn có thể chia chuỗi tại -
Chuyển đổi văn bản để ints (int.TryParse)
Output int như là một chuỗi hex {0: x2}

1

của bạn tham chiếu đến "0x31 = 1 "làm cho tôi nghĩ rằng bạn đang thực sự cố gắng chuyển đổi giá trị ASCII thành chuỗi - trong trường hợp này bạn nên sử dụng một cái gì đó như Encoding.ASCII.GetString (Byte [])

4

Để được hỗ trợ Unicode:

public class HexadecimalEncoding 
{ 
    public static string ToHexString(string str) 
    { 
     var sb = new StringBuilder(); 

     var bytes = Encoding.Unicode.GetBytes(str); 
     foreach (var t in bytes) 
     { 
      sb.Append(t.ToString("X2")); 
     } 

     return sb.ToString(); // returns: "48656C6C6F20776F726C64" for "Hello world" 
    } 

    public static string FromHexString(string hexString) 
    { 
     var bytes = new byte[hexString.Length/2]; 
     for (var i = 0; i < bytes.Length; i++) 
     { 
      bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); 
     } 

     return Encoding.Unicode.GetString(bytes); // returns: "Hello world" for "48656C6C6F20776F726C64" 
    } 
} 
+0

Điều này dường như không hoạt động. Sử dụng Windows 8.1, Visual C# 2010 Express. – akinuri

0

Nếu bạn cần kết quả như mảng byte, bạn nên vượt qua nó trực tiếp mà không cần thay đổi nó thành một chuỗi, sau đó thay đổi nó trở lại byte. Trong ví dụ của bạn, (f.e .: 0x31 = 1) là mã ASCII. Trong trường hợp đó để chuyển đổi một chuỗi (các giá trị hex) để giá trị ASCII sử dụng: Encoding.ASCII.GetString(byte[])

 byte[] data = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; 
     string ascii=Encoding.ASCII.GetString(data); 
     Console.WriteLine(ascii); 

Giao diện điều khiển sẽ hiển thị: 1234567890

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