2009-04-07 27 views
23

Muszę sprawdzić, czy string znajduje się w pakiecie, który otrzymuję jako tablica byte. Jeśli użyję BitConverter.ToString(), otrzymam bajty jako string z myślnikami (f.e .: 00-50-25-40-A5-FF).
Próbowałem większość funkcji, które znalazłem po szybkim googlowaniu, ale większość z nich ma parametr wejściowy typu string i jeśli zadzwonię do nich z string z myślnikami, Zgłasza wyjątek.Konwersja z ciągu szesnastkowego na ciąg znaków

Potrzebuję funkcji, która zamienia hex (jako string lub jako byte) na string, który reprezentuje wartość szesnastkową (f.e .: 0x31 = 1). Jeśli parametr wejściowy to string, funkcja powinna rozpoznawać kreski (przykład "47-61-74-65-77-61-79-53-65-72-76-65-72"), ponieważ BitConverter nie konwertuje poprawnie .

+0

Dlaczego nie po prostu usunąć kreski ? –

+0

Znalazłem dobrą metodę w Code Review: http://codereview.stackexchange.com/questions/97950/conversion-of-hexadecimal-tring-to-string – Breeze

Odpowiedz

48

Tak jak?

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? To jest wartość "s" ... –

+0

@ Marc, Dzięki! @ lan, To jest tablica bajtów, którą dałem w moim pytaniu, Marc jest bardziej wdzięczny za pomoc w sprawdzeniu go jako napis. :) –

+0

@Marc, tak tak .. Zauważyłem, że .. erm .. (ukrywa się pod biurkiem) –

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

można podzielić ciąg na -
Konwersja tekstu do int (int.TryParse)
Wyjście int jako ciąg szesnastkowy {0: x2}

1

odniesienia do „0x31 = 1 "sprawia, że ​​myślę, że faktycznie próbujesz przekonwertować wartości ASCII na łańcuchy - w takim przypadku powinieneś używać czegoś podobnego do Encoding.ASCII.GetString (Byte [])

4

Na wsparcie 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

To nie działa. Korzystanie z systemu Windows 8.1, Visual C# 2010 Express. – akinuri

0

Jeśli potrzebujesz wynik jako tablicę bajtów, należy przekazać go bezpośrednio bez zmieniania go na ciąg znaków, a następnie zmienić go z powrotem do bajtów. W twoim przykładzie (f.e .: 0x31 = 1) są kody ASCII. W takim przypadku, aby przekonwertować ciąg (wartości hex) do wartości ASCII użyć: 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); 

Konsola wyświetli: 1234567890