2013-06-08 3 views
37

У меня есть строка типа "sample". Я хочу получить строку в hex формате; например:Преобразование строки в шестнадцатеричную строку в C#

"796173767265" 

Пожалуйста, дайте синтаксис C#.

+0

Какой формат шестигранной вы говорите? ASCII? (Пример, который вы даете, не ASCII для «sample», это ссылочный адрес?) Маленький конечный или большой? Какой размер? – jpaugh

ответ

83

Сначала вам нужно, чтобы получить его в byte[], так что это:

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

, а затем вы можете получить строку:

var hexString = BitConverter.ToString(ba); 

сейчас, что собирается возвращать строку с тире (-) в нем, так что вы можете просто использовать это:

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

, чтобы получить избавиться от них, если хотите.

ПРИМЕЧАНИЕ: вы могли бы использовать другой Encoding, если вам нужно.

+0

Использование кодировки по умолчанию может потерпеть неудачу в любом случае? Например, работаете в разных версиях Windows? – jacktric

+1

@jacktric, если вы знаете кодировку, вы всегда должны использовать конкретную кодировку. Тем не менее, я использую кодировку 'Default' более десятилетия и не имею проблем в производстве по географическим местам или версиям Windows. –

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

ИЛИ

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

Вы можете упростить это до '((int) c) .ToString (" X ")'. – svick

+0

@svick это еще короче :) спасибо – Damith

+2

На самом деле, я понял, что это было бы неправильно для любых символов ≤ 0x0F из-за отсутствия нулевого заполнения. Чтобы исправить это, используйте 'ToString (« X2 »)'. – svick

8

В соответствии с этим фрагментом here, этот подход должен быть хорош для длинных строк:

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(); 
} 

использование:

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

Другой подход в одной строке

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

Для поддержки 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

Лучше использовать два 'Extension Method's для этого – pylover

2

несколько 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("-", ""); 
Смежные вопросы