383 Stimmen

byte[] in Hex-String

Wie konvertiere ich eine byte[] zu einer string ? Jedes Mal, wenn ich es versuche, bekomme ich

System.Byte[]

anstelle des Wertes.

Und wie erhalte ich den Wert in Hexadezimal- statt in Dezimalwerten?

22voto

Quintin Robinson Punkte 78652

Nun, ich konvertiere nicht oft Bytes in Hex, also muss ich sagen, dass ich nicht weiß, ob es einen besseren Weg als diesen gibt, aber hier ist ein Weg, es zu tun.

StringBuilder sb = new StringBuilder();
foreach (byte b in myByteArray)
    sb.Append(b.ToString("X2"));

string hexString = sb.ToString();

12voto

Patrick Punkte 1706

Sehr schnelle Verlängerungsmethoden (mit Umkehrung):

public static class ExtensionMethods {
    public static string ToHex(this byte[] data) {
        return ToHex(data, "");
    }
    public static string ToHex(this byte[] data, string prefix) {
        char[] lookup = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        int i = 0, p = prefix.Length, l = data.Length;
        char[] c = new char[l * 2 + p];
        byte d;
        for(; i < p; ++i) c[i] = prefix[i];
        i = -1;
        --l;
        --p;
        while(i < l) {
            d = data[++i];
            c[++p] = lookup[d >> 4];
            c[++p] = lookup[d & 0xF];
        }
        return new string(c, 0, c.Length);
    }
    public static byte[] FromHex(this string str) {
        return FromHex(str, 0, 0, 0);
    }
    public static byte[] FromHex(this string str, int offset, int step) {
        return FromHex(str, offset, step, 0);
    }
    public static byte[] FromHex(this string str, int offset, int step, int tail) {
        byte[] b = new byte[(str.Length - offset - tail + step) / (2 + step)];
        byte c1, c2;
        int l = str.Length - tail;
        int s = step + 1;
        for(int y = 0, x = offset; x < l; ++y, x += s) {
            c1 = (byte)str[x];
            if(c1 > 0x60) c1 -= 0x57;
            else if(c1 > 0x40) c1 -= 0x37;
            else c1 -= 0x30;
            c2 = (byte)str[++x];
            if(c2 > 0x60) c2 -= 0x57;
            else if(c2 > 0x40) c2 -= 0x37;
            else c2 -= 0x30;
            b[y] = (byte)((c1 << 4) + c2);
        }
        return b;
    }
}

Schlägt alle anderen im obigen Geschwindigkeitstest:

\=== Langer String-Test
BitConvertReplace Berechnung Verstrichene Zeit 2415 ms
StringBuilder-Berechnung Verstrichene Zeit 5668 ms
LinqConcat-Berechnung Verstrichene Zeit 11826 ms
LinqJoin-Berechnung Verstrichene Zeit 9323 ms
LinqAgg-Berechnung Verstrichene Zeit 7444 ms
ToHexTable-Berechnung Verstrichene Zeit 1028 ms
ToHexAcidzombie Berechnung Verstrichene Zeit 1035 ms
ToHexPatrick-Berechnung Verstrichene Zeit 814 ms
ToHexKurt Berechnung Verstrichene Zeit 1604 ms
ByteArrayToHexString Berechnung Verstrichene Zeit 1330 ms

\=== Viele String-Tests
BitConvertReplace Berechnung Verstrichene Zeit 2238 ms
StringBuilder-Berechnung Verstrichene Zeit 5393 ms
LinqConcat-Berechnung Verstrichene Zeit 9043 ms
LinqJoin-Berechnung Verstrichene Zeit 9131 ms
LinqAgg-Berechnung Verstrichene Zeit 7324 ms
ToHexTable-Berechnung Verstrichene Zeit 968 ms
ToHexAcidzombie Berechnung Verstrichene Zeit 969 ms
ToHexPatrick-Berechnung Verstrichene Zeit 956 ms
ToHexKurt Berechnung Verstrichene Zeit 1547 ms
ByteArrayToHexString Berechnung Verstrichene Zeit 1277 ms

12voto

Ich dachte, ich sollte eine Antwort geben. Nach meinem Test ist diese Methode die schnellste

public static class Helper
{
    public static string[] HexTbl = Enumerable.Range(0, 256).Select(v => v.ToString("X2")).ToArray();
    public static string ToHex(this IEnumerable<byte> array)
    {
        StringBuilder s = new StringBuilder();
        foreach (var v in array)
            s.Append(HexTbl[v]);
        return s.ToString();
    }
    public static string ToHex(this byte[] array)
    {
        StringBuilder s = new StringBuilder(array.Length*2);
        foreach (var v in array)
            s.Append(HexTbl[v]);
        return s.ToString();
    }
}

7voto

Allan Punkte 1004

Um noch eine weitere Antwort auf den Stapel zu geben: Es gibt eine System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary Klasse, die ich verwendet habe, die Bytes in und aus Hex konvertieren kann:

string hex = new SoapHexBinary(bytes).ToString();
byte[] bytes = SoapHexBinary.Parse(hex).Value;

Ich bin mir nicht sicher, wie es im Vergleich (Benchmark) zu anderen Implementierungen aussieht, aber IMO ist es ziemlich einfach - insbesondere für die Konvertierung von Hex zurück in Bytes.

5voto

Barn Monkey Punkte 235

Mit:

byte[] data = new byte[] { 0x01, 0x02, 0x03, 0x0D, 0x0E, 0x0F };
string hex = string.Empty;
data.ToList().ForEach(b => hex += b.ToString("x2"));
// use "X2" for uppercase hex letters
Console.WriteLine(hex);

Ergebnis: 0102030d0e0f

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X