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?
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?
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
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();
}
}
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.
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.