1576 Stimmen

Wie konvertiert man ein Byte-Array in eine hexadezimale Zeichenfolge und umgekehrt?

Wie kann man ein Byte-Array in eine hexadezimale Zeichenkette umwandeln und umgekehrt?

10 Stimmen

Die akzeptierte Antwort unten scheinen eine schreckliche Menge von Zeichenfolgen in der Zeichenfolge in Bytes-Konvertierung zuzuweisen. Ich frage mich, wie sich dies auf die Leistung auswirkt

4voto

JoseH Punkte 86

Diese Version von ByteArrayToHexViaByteManipulation könnte schneller sein.

Aus meinen Berichten:

  • ByteArrayToHexViaByteManipulation3: 1,68 durchschnittliche Ticks (über 1000 Durchläufe), 17,5X
  • ByteArrayToHexViaByteManipulation2: 1,73 durchschnittliche Ticks (über 1000 Durchläufe), 16,9X
  • ByteArrayToHexViaByteManipulation: 2,90 durchschnittliche Ticks (über 1000 Durchläufe), 10,1X
  • ByteArrayToHexViaLookupAndShift: 3,22 durchschnittliche Ticks (über 1000 Durchläufe), 9,1X
  • ...

    static private readonly char[] hexAlphabet = new char[]
        {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    static string ByteArrayToHexViaByteManipulation3(byte[] bytes)
    {
        char[] c = new char[bytes.Length * 2];
        byte b;
        for (int i = 0; i < bytes.Length; i++)
        {
            b = ((byte)(bytes[i] >> 4));
            c[i * 2] = hexAlphabet[b];
            b = ((byte)(bytes[i] & 0xF));
            c[i * 2 + 1] = hexAlphabet[b];
        }
        return new string(c);
    }

Und ich denke, das ist eine Optimierung:

    static private readonly char[] hexAlphabet = new char[]
        {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    static string ByteArrayToHexViaByteManipulation4(byte[] bytes)
    {
        char[] c = new char[bytes.Length * 2];
        for (int i = 0, ptr = 0; i < bytes.Length; i++, ptr += 2)
        {
            byte b = bytes[i];
            c[ptr] = hexAlphabet[b >> 4];
            c[ptr + 1] = hexAlphabet[b & 0xF];
        }
        return new string(c);
    }

4voto

Fredrik Hu Punkte 51

Ich habe den von Ihnen vorgeschlagenen Code nicht zum Laufen gebracht, Olipro. hex[i] + hex[i+1] offenbar eine int .

Ich hatte jedoch einigen Erfolg, indem ich einige Hinweise von Waleeds Code nahm und diesen zusammenhämmerte. Es ist hässlich wie die Hölle, aber es scheint zu funktionieren und führt bei 1/3 der Zeit im Vergleich zu den anderen nach meinen Tests (mit Patridges Testmechanismus). Abhängig von der Eingabegröße. Wenn man die ?:s umdreht, um 0-9 zuerst zu trennen, würde man wahrscheinlich ein etwas schnelleres Ergebnis erzielen, da es mehr Zahlen als Buchstaben gibt.

public static byte[] StringToByteArray2(string hex)
{
    byte[] bytes = new byte[hex.Length/2];
    int bl = bytes.Length;
    for (int i = 0; i < bl; ++i)
    {
        bytes[i] = (byte)((hex[2 * i] > 'F' ? hex[2 * i] - 0x57 : hex[2 * i] > '9' ? hex[2 * i] - 0x37 : hex[2 * i] - 0x30) << 4);
        bytes[i] |= (byte)(hex[2 * i + 1] > 'F' ? hex[2 * i + 1] - 0x57 : hex[2 * i + 1] > '9' ? hex[2 * i + 1] - 0x37 : hex[2 * i + 1] - 0x30);
    }
    return bytes;
}

2voto

Erçin Dedeoğlu Punkte 4262

Kürzester Weg und .net core unterstützt:

    public static string BytesToString(byte[] ba) =>
        ba.Aggregate(new StringBuilder(32), (sb, b) => sb.Append(b.ToString("X2"))).ToString();

1 Stimmen

Das ist großartig, auch wenn es ba 16 Bytes oder weniger beträgt. Was aber sein sollte, ist new StringBuilder(ba.Length * 2) so dass es effizient mit Byte-Arrays beliebiger Länge umgehen kann.

2voto

Gregory Morse Punkte 344

Es gibt eine einfache Ein-Zeilen-Lösung, die noch nicht erwähnt wurde, die hexadezimale Zeichenketten in Byte-Arrays konvertiert (wir kümmern uns hier nicht um die negative Interpretation, da sie keine Rolle spielt):

BigInteger.Parse(str, System.Globalization.NumberStyles.HexNumber).ToByteArray().Reverse().ToArray();

0 Stimmen

Dabei bleiben führende 0-Bytes nicht erhalten. Zum Beispiel kann eine Zeichenfolge von "000080" ergibt ein Ein-Byte-Array von { 0x80 } und nicht das erwartete Drei-Byte-Array von { 0x00, 0x00, 0x80 }

0 Stimmen

Ja, ich nehme an, dass etwas in der Art von Enumerable.Repeat<byte>(0, (len(str) / 2 - len(bigIntBytes)).Concat(bigIntBytes).ToArray() in diesem Fall erforderlich ist.

0 Stimmen

Anstatt das Array umzudrehen, können Sie das Array im Big-Endian-Modus erstellen: .ToByteArray(isBigEndian: true)

2voto

spacepille Punkte 3981

Eine weitere schnelle Funktion...

private static readonly byte[] HexNibble = new byte[] {
    0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
    0x8, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
    0x0, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF
};

public static byte[] HexStringToByteArray( string str )
{
    int byteCount = str.Length >> 1;
    byte[] result = new byte[byteCount + (str.Length & 1)];
    for( int i = 0; i < byteCount; i++ )
        result[i] = (byte) (HexNibble[str[i << 1] - 48] << 4 | HexNibble[str[(i << 1) + 1] - 48]);
    if( (str.Length & 1) != 0 )
        result[byteCount] = (byte) HexNibble[str[str.Length - 1] - 48];
    return result;
}

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