2017-07-12 4 views
0

Entschuldigung, wenn das irgendwo beantwortet wurde, aber wenn es so ist, konnte ich es nicht finden.Konsequente Byte-Darstellung von ungültigen Zeichen

Ich mache einige Manipulationen mit Byte-Arrays, und habe festgestellt, dass beim Konvertieren von ungültigen Zeichen (zum Beispiel das Byte 0x9C) es als "?" Interpretiert wird. Daher, wenn ich es zurück in ein Byte umwandele, kommt es als 0x3F heraus.

Mein Problem ist, dass Teile der Byte-Arrays ASCII sind, aber andere sind Prüfsummen, die ungültige Zeichen wie diese enthalten können. Ich möchte in der Lage sein, das gesamte Array für Bequemlichkeit in eine Zeichenfolge umzuwandeln. Gibt es eine Codierung, die ASCII für normale Zeichen ergibt und sicherstellen, dass das Konvertieren eines ungültigen Zeichens in eine Zeichenkette und zurück dasselbe Byte ergibt?

Antwort

0

Kann nicht für andere arbeiten, aber ich fand, dass durch die Verwendung

System.Text.Encoding.Default.GetString(...) 

und

System.Text.Encoding.Default.GetBytes(...) 

zu anderen Kodierungen Gegensatz verhinderte, dass die Werte in Byte-Arrays aus geändert werden „?“ und ASCII-Zeichen wurden immer noch korrekt interpretiert.

+0

Es gibt immer noch Werte, die dazu führen können, dass Sie ungültige Daten erhalten. Wenn Sie ein Byte [] als String darstellen müssen, sollten Sie 'Convert.ToBase64String (' 'und' Convert.FromBase64String ('Auch wenn Sie Daten zwischen Computern' System.Text.Encoding.Default' senden wollen) verwenden Anders als von System zu System.Nehmen Sie einfach Ihre Prüfsummen und machen Sie ihr eigenes Byte [] und fügen Sie den Base64-Text von ihnen an das Ende der Zeichenfolge an. –

+0

Standard variiert zwischen Maschinen, Benutzern und Zeit.Es ist selten die richtige Wahl, aber könnte habe die Chance, den Kontext der in der Frage beschriebenen Hin-und-Her-Transformation zu bearbeiten –

+0

Ich sollte hinzufügen, ich fand den Standard auf meiner Maschine als System.Text.Encoding.SBCSCodePageEncoding und habe den Code geändert, um dies zu spezifizieren Es kann sehr gut noch ungültige Daten geben, aber bis jetzt funktioniert es richtig – Cobalt

0

Nicht sicher, was Sie mit "normalen Zeichen" meinen, aber Sie fragen nach einer Kodierung, die beliebige Sequenzen beliebiger Bytewerte 0-255 dekodieren kann. Es müsste für einen Zeichensatz mit 256 Codepunkten sein, 1-Byte-Codeeinheiten haben, alle Codepunkte in einer Codeeinheit codieren, in den .NET-Basisklassenbibliotheken sein und der Zeichensatz eine Untermenge von Unicode sein.

ISO 8859-1 und CP437 sind zwei, die diese Anforderungen erfüllen. Sie können überprüfen, ob sie Ihre "normalen Zeichen" in Unicode "normalen Zeichen" zuordnen. (Hinweis: ISO 8859-1 hat die gleichen Zeichen wie die C0 Control and Basic Latin und die C1-Steuerelemente und Latin-1 Supplement-Blöcke.)

BTW-sind Sie sicher, dass Bereiche Ihres Datenformats Text in ASCII codiert sind und nicht einige andere Zeichencodierung?

Verwandte Themen