Ich habe ein byte[]
Array, das aus einer mir bekannten Datei geladen wird und UTF-8 enthält .
In einigen Debugging-Codes muss ich es in eine Zeichenfolge konvertieren. Gibt es einen Einzeiler, der dies erledigt?
Unter dem Deckmantel sollte es nur eine Zuordnung und eine Memkopie sein , also sollte es möglich sein , auch wenn es nicht implementiert ist.
Antworten:
quelle
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Es gibt mindestens vier verschiedene Möglichkeiten, diese Konvertierung durchzuführen.
GetString von Encoding
, aber Sie können die ursprünglichen Bytes nicht zurückerhalten, wenn diese Bytes Nicht-ASCII-Zeichen enthalten.
BitConverter.ToString
Die Ausgabe ist eine durch "-" getrennte Zeichenfolge, es gibt jedoch keine in .NET integrierte Methode, um die Zeichenfolge zurück in ein Byte-Array zu konvertieren.
Convert.ToBase64String Mit können
Sie die Ausgabezeichenfolge einfach wieder in ein Byte-Array konvertieren
Convert.FromBase64String
.Hinweis: Die Ausgabezeichenfolge kann '+', '/' und '=' enthalten. Wenn Sie die Zeichenfolge in einer URL verwenden möchten, müssen Sie sie explizit codieren.
HttpServerUtility.UrlTokenEncode Mit können
Sie die Ausgabezeichenfolge einfach wieder in ein Byte-Array konvertieren
HttpServerUtility.UrlTokenDecode
. Die Ausgabezeichenfolge ist bereits URL-freundlich! Der Nachteil ist, dass eineSystem.Web
Montage erforderlich ist, wenn Ihr Projekt kein Webprojekt ist.Ein vollständiges Beispiel:
quelle
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Eine allgemeine Lösung zum Konvertieren von Bytearray in Zeichenfolge, wenn Sie die Codierung nicht kennen:
quelle
Definition:
Verwenden von:
quelle
Das Konvertieren von a
byte[]
in astring
scheint einfach zu sein, aber jede Art von Codierung kann die Ausgabezeichenfolge durcheinander bringen. Diese kleine Funktion funktioniert nur ohne unerwartete Ergebnisse:quelle
Verwenden von
(byte)b.ToString("x2")
Ausgängenb4b5dfe475e58b67
quelle
Es gibt auch die Klasse UnicodeEncoding, die recht einfach zu verwenden ist:
quelle
UnicodeEncoding
ist der schlechteste Klassenname aller Zeiten; Unicode ist überhaupt keine Codierung. Diese Klasse ist eigentlich UTF-16. Die Little-Endian-Version, denke ich.Alternative:
quelle
Ein Linq-Einzeiler zum Konvertieren eines
byteArrFilename
aus einer Datei gelesenen Byte-Arrays in eine reine ASCII-Zeichenfolge mit nullter Endung wäre: Praktisch zum Lesen von Dingen wie Dateiindex-Tabellen in alten Archivformaten.Ich verwende hier
'?'
als Standardzeichen alles, was nicht rein ASCII ist, aber das kann natürlich geändert werden. Wenn Sie sicher sein möchten, dass Sie es erkennen können, verwenden Sie'\0'
stattdessen einfach , da dasTakeWhile
am Anfang sicherstellt, dass eine auf diese Weise erstellte Zeichenfolge möglicherweise keine'\0'
Werte aus der Eingabequelle enthalten kann .quelle
BitConverter
Klasse kann verwendet werden, um einbyte[]
in zu konvertierenstring
.Die Dokumentation der
BitConverter
Klasse kann auf MSDN erfolgenquelle
Meines Wissens garantiert keine der angegebenen Antworten ein korrektes Verhalten bei Nullbeendigung. Bis mich jemand anders zeigt, habe ich meine eigene statische Klasse geschrieben, um dies mit den folgenden Methoden zu behandeln:
Der Grund für das
startIndex
war in dem Beispiel, an dem ich speziell arbeitete, dass ich abyte[]
als Array von nullterminierten Zeichenfolgen analysieren musste . Es kann im einfachen Fall sicher ignoriert werdenquelle
byteArr.TakeWhile(x => x != 0)
ist eine schnelle und einfache Möglichkeit, das Problem der Nullterminierung zu lösen.Hier ist ein Ergebnis, bei dem Sie sich nicht um die Codierung kümmern mussten. Ich habe es in meiner Netzwerkklasse verwendet und binäre Objekte als String damit gesendet.
quelle
Wenn Sie .NET35 oder .NET35 CE verwenden, müssen Sie zusätzlich zur ausgewählten Antwort den Index des ersten zu decodierenden Bytes und die Anzahl der zu decodierenden Bytes angeben:
quelle
Probieren Sie diese Konsolen-App aus:
quelle
Ich habe in diesem Beitrag einige Antworten gesehen und es ist möglich, als abgeschlossenes Basiswissen zu gelten, da es in der C # -Programmierung verschiedene Ansätze gibt, um dasselbe Problem zu lösen. Es muss nur ein Unterschied zwischen Pure UTF-8 und UTF-8 mit Stückliste berücksichtigt werden .
In der letzten Woche muss ich bei meiner Arbeit eine Funktionalität entwickeln, die CSV-Dateien mit Stückliste und andere CSVs mit reinem UTF-8 (ohne Stückliste) ausgibt. Jeder CSV-Dateikodierungstyp wird von verschiedenen nicht standardisierten APIs verwendet, nämlich dieser API liest UTF-8 mit Stückliste und die andere API liest ohne Stückliste. Ich muss die Referenzen zu diesem Konzept recherchieren und lesen " Was ist der Unterschied zwischen UTF-8 und UTF-8 ohne Stückliste? ". Diskussion über Stapelüberlauf und diesen Wikipedia-Link " Byte Order Mark ", um meinen Ansatz zu erstellen.
Schließlich musste meine C # -Programmierung für die beiden UTF-8-Codierungstypen (mit Stückliste und rein) ähnlich sein wie in diesem Beispiel unten:
quelle