2009-04-07 35 views
23

Devo verificare per un string situato all'interno di un pacchetto che ricevo come matrice byte. Se utilizzo BitConverter.ToString(), ottengo i byte come string con trattini (ad es .: 00-50-25-40-A5-FF).
Ho provato la maggior parte delle funzioni che ho trovato dopo un rapido googling, ma la maggior parte di esse ha il tipo di parametro di input string e se le chiamo con lo string con trattini, genera un'eccezione.Conversione da esadecimale a stringa

Ho bisogno di una funzione che trasforma esagono (come string o come byte) nel string che rappresenta il valore esadecimale (f.e .: 0x31 = 1). Se il parametro di input è string, la funzione dovrebbe riconoscere trattini (ad esempio "47-61-74-65-77-61-79-53-65-72-76-65-72"), perché BitConverter non viene convertita correttamente .

+0

Perché non solo rimuovere i trattini ? –

+0

Ho trovato un buon metodo alla revisione del codice: http://codereview.stackexchange.com/questions/97950/conversion-of-hexadecimal-string-to-string – Breeze

risposta

48

Ti piace?

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? Questo è il valore di "s" ... –

+0

@ Marc, grazie! @ lan, Questo è l'array di byte che ho dato nella mia domanda, Marc è più utile per averlo verificato come stringa. :) –

+0

@Marc, sì sì .. Ho notato che .. erm .. (nasconde sotto banco) –

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

È possibile dividere la stringa al -
Convertire il testo da int (int.TryParse)
uscita int come una stringa esadecimale {0: x2}

1

suo riferimento a "0x31 = 1 "mi fa pensare che stai effettivamente cercando di convertire i valori ASCII in stringhe - nel qual caso dovresti usare qualcosa come Encoding.ASCII.GetString (Byte [])

4

Per il supporto 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

Questo non sembra funzionare. Utilizzando Windows 8.1, Visual C# 2010 Express. – akinuri

0

Se è necessario il risultato come array di byte, si dovrebbe passare direttamente senza cambiare in una stringa, poi cambiare di nuovo al byte. Nel tuo esempio il (f.e .: 0x31 = 1) sono i codici ASCII. In tal caso, per convertire una stringa (di valori esadecimali) per valori ASCII usare: 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 consolle mostrerà: 1234567890

Problemi correlati