2009-04-07 34 views
23

Necesito comprobar para un string localizado dentro de un paquete que recibo como byte matriz. Si uso BitConverter.ToString(), obtengo los bytes como string con guiones (es decir: 00-50-25-40-A5-FF).
Intenté la mayoría de las funciones que encontré después de una rápida búsqueda en Google, pero la mayoría de ellas tienen el tipo de parámetro de entrada string y si las llamo con string con guiones, arroja una excepción.Convertir del hexágono a la cadena

necesito una función que convierte hex (como string o como byte) en el string que representa el valor hexadecimal (f.e .: 0x31 = 1). Si el parámetro de entrada es string, la función debería reconocer guiones (ejemplo "47-61-74-65-77-61-79-53-65-72-76-65-72"), porque BitConverter no se convierte correctamente .

+0

¿Por qué no eliminar los guiones ? –

+0

Encontré un buen método en Code Review: http://codereview.stackexchange.com/questions/97950/conversion-of-hexadecimal-string-to-string – Breeze

Respuesta

48

¿Te gusta?

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 - ¿eh? Ese es el valor de "s" ... –

+0

@ Marc, ¡Gracias! @ lan, Esa es la matriz de bytes que di en mi pregunta, Marc agradece mucho más por comprobarlo como cadena. :) –

+0

@Marc, sí, sí ... Me di cuenta de que ... erm ... (se esconde debajo del escritorio) –

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

Puede dividir la cadena en el -
Convertir el texto a enteros (int.TryParse)
salida del int como una cadena hexadecimal {0: x2}

1

Su referencia a "0x31 = 1 "me hace pensar que realmente está intentando convertir valores ASCII en cadenas, en cuyo caso debería usar algo como Encoding.ASCII.GetString (Byte [])

4

Para soporte 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

Esto no parece funcionar. Usando Windows 8.1, Visual C# 2010 Express. – akinuri

0

Si necesita el resultado como matriz de bytes, debe pasar directamente sin necesidad de cambiar a una cadena, a continuación, cambiar de nuevo a bytes. En su ejemplo, (por ejemplo: 0x31 = 1) son los códigos ASCII. En ese caso, para convertir una cadena (de valores hex) a valores ASCII usar: 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); 

la consola mostrará: 1234567890