2009-04-07 5 views
23

Мне нужно проверить наличие string, находящегося внутри пакета, который я получаю как массив byte. Если я использую BitConverter.ToString(), я получаю байты как string с тире (f.e .: 00-50-25-40-A5-FF).
Я пробовал большинство функций, которые я нашел после быстрого поиска в googling, но у большинства из них есть тип входных параметров string, и если я их вызову с помощью string с тире, он выдает исключение.Преобразование из шестнадцатеричного в строку

мне нужна функция, которая превращает гекс (как string или byte) в string, который представляет шестнадцатеричное значение (f.e .: 0x31 = 1). Если входной параметр равен string, функция должна распознавать тире (например, «47-61-74-65-77-61-79-53-65-72-76-65-72»), потому что BitConverter неверно преобразует ,

+0

Почему не просто удалить черточки ? –

+0

Я нашел хороший метод в обзоре кода: http://codereview.stackexchange.com/questions/97950/conversion-of-hexadecimal-string-to-string – Breeze

ответ

48

Как так?

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? Это значение «s» ... –

+0

@ Marc, Спасибо! @ lan, Это массив байтов, который я дал в моем вопросе, Марк больше благодарен за проверку его как строки. :) –

+0

@Marc, да да .. Я заметил, что .. erm .. (прячется под столом) –

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

Вы можете разбить строку на -
Преобразование текста в Интс (int.TryParse)
Выходные данные В ИНТ в качестве шестнадцатеричной строки {0: x2}

1

Ваша ссылка на «0x31 = 1 "заставляет меня думать, что вы на самом деле пытаетесь преобразовать значения ASCII в строки - в этом случае вы должны использовать что-то вроде Encoding.ASCII.GetString (Byte [])

4

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

Это не работает. Использование Windows 8.1, Visual C# 2010 Express. – akinuri

0

Если вам нужен результат в виде массива байтов, вы должны передать его непосредственно, не изменяя его в строку, а затем изменить его обратно в байтах. В вашем примере (f.e .: 0x31 = 1) - коды ASCII. В этом случае, чтобы преобразовать строку (шестнадцатеричных значений) до значений ASCII использовать: 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); 

Консоль отобразит: 1234567890

Смежные вопросы