2013-06-08 49 views
37

Tôi có một chuỗi như "mẫu". Tôi muốn lấy một chuỗi ở định dạng số hex; như thế này:Chuyển chuỗi thành chuỗi thập lục phân trong C#

"796173767265" 

Vui lòng cung cấp cú pháp C#.

+0

Định dạng hex bạn đang nói về? ASCII? (Ví dụ bạn đưa ra không phải là ASCII cho "mẫu", đó là một địa chỉ tham khảo?) Little endian, hoặc lớn? Cỡ nào? – jpaugh

Trả lời

83

Trước tiên, bạn sẽ cần phải làm cho nó vào một byte[], vì vậy làm điều này:

byte[] ba = Encoding.Default.GetBytes("sample"); 

và sau đó bạn có thể nhận được chuỗi:

var hexString = BitConverter.ToString(ba); 

bây giờ, đó là sẽ trả về một chuỗi với dấu gạch ngang (-) trong đó để bạn có thể chỉ cần sử dụng điều này:

hexString = hexString.Replace("-", ""); 

để nhận loại bỏ những thứ đó nếu bạn muốn.

LƯU Ý: bạn có thể sử dụng Encoding khác nếu bạn cần.

+0

Sử dụng Mã hóa mặc định có thể bị lỗi trong mọi trường hợp? Chạy trên các phiên bản Windows khác nhau chẳng hạn? – jacktric

+1

@jacktric nếu bạn biết mã hóa, bạn nên luôn sử dụng mã hóa cụ thể. Tuy nhiên, tôi đã sử dụng mã hóa 'Mặc định' trong hơn một thập kỷ và không gặp vấn đề gì trong sản xuất trên các vị trí địa lý hoặc các phiên bản của Windows. –

19
var result = string.Join("", input.Select(c => ((int)c).ToString("X2"))); 

HOẶC

var result =string.Join("", 
       input.Select(c=> String.Format("{0:X2}", Convert.ToInt32(c)))); 
+2

Bạn có thể đơn giản hóa điều đó thành '((int) c) .ToString (" X ")'. – svick

+0

@svick thậm chí còn ngắn hơn :) nhờ – Damith

+2

Thực ra, tôi nhận ra điều này sẽ sai đối với bất kỳ ký tự nào ≤ 0x0F, vì thiếu số đệm. Để khắc phục điều đó, sử dụng 'ToString (" X2 ")'. – svick

8

Theo đoạn này here, phương pháp này nên được tốt cho chuỗi dài:

private string StringToHex(string hexstring) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (char t in hexstring) 
    { 
     //Note: X for upper, x for lower case letters 
     sb.Append(Convert.ToInt32(t).ToString("x")); 
    } 
    return sb.ToString(); 
} 

sử dụng:

string result = StringToHex("Hello world"); //returns "48656c6c6f20776f726c64" 

Một cách tiếp cận trong một dòng

string input = "Hello world"; 
string result = String.Concat(input.Select(x => ((int)x).ToString("x"))); 
14

Để đượ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" 
    } 
} 
+3

Tốt hơn nên sử dụng hai Phương pháp mở rộng 'cho – pylover

2

vài lựa chọn thay thế Unicode

var s = "0"; 

var s1 = s.Aggregate("", (h, c) => h + ((int)c).ToString("x4"));   // left padded with 0  "0030d835dfcfd835dfdad835dfe5d835dff0d835dffb" 
var s2 = s.Aggregate("", (h, c) => h + string.Format("{0,4:x}", (int)c)); // left padded with space " 30d835dfcfd835dfdad835dfe5d835dff0d835dffb" 

var sL = BitConverter.ToString(Encoding.Unicode.GetBytes(s)).Replace("-", "");  // Little Endian "300035D8CFDF35D8DADF35D8E5DF35D8F0DF35D8FBDF" 
var sB = BitConverter.ToString(Encoding.BigEndianUnicode.GetBytes(s)).Replace("-", ""); // Big Endian "0030D835DFCFD835DFDAD835DFE5D835DFF0D835DFFB" 

// no encodding "300035D8CFDF35D8DADF35D8E5DF35D8F0DF35D8FBDF" 
byte[] b = new byte[s.Length * sizeof(char)]; 
Buffer.BlockCopy(s.ToCharArray(), 0, b, 0, b.Length); 
var sb = BitConverter.ToString(b).Replace("-", ""); 
Các vấn đề liên quan