2011-01-05 14 views
1

Ich habe gerade ein Problem festgestellt, als ich versuchte, eine kleine Verschlüsselungs-DLL für unser Unternehmen zu schreiben (das erste Mal, dass ich so etwas tun musste).Problem mit .NET-Encoding-Namespace?

Wenn ich den folgenden Code verwenden, um das Byte [] aus einer Zeichenfolge (in meinem Fall ein britisches Pfundzeichen £), und verwenden Sie dann den gleichen Bereich des .NET Framework, um die char [] für die byte [] Ich bekomme ein Fragezeichen anstelle des erwarteten £!

Kann mir jemand erklären, warum das so ist?

byte [] asciiBytes = Codierung.ASCII.GetBytes ("£"); Console.WriteLine (Encoding.ASCII.GetChars (asciiBytes) .ToString());

+1

GetChars gibt char [] zurück, oder? Ist char []. ToString() überhaupt sinnvoll? 'new string (char [])' würde wahrscheinlicher aussehen, oder GetString ...? –

+0

Hinweis zum Titel Ihrer Frage: Codierung ist eine Klasse, kein Namespace. –

+0

Früher hatte ich ein prähistorisches englisches Design, das einen Charakter ROM und Tastatur hatte, die $ durch £ ersetzt. Die Firma hielt nicht lange genug, um irgendeine Art von Standard zu setzen. –

Antwort

3

Sie versuchen, die ASCII-Codierung zu verwenden, aber das Nummernzeichen ist nicht in ASCII. Die Codierung kann nicht mit dem Zeichen umgehen, also verwendet es die codierte Form von "?" als Indikator, dass etwas nicht stimmt.

Ich schlage vor, dass Sie stattdessen UTF-8 verwenden. Alle Unicode-Zeichen können in UTF-8 dargestellt werden, und es ist effizient für echte ASCII-Zeichenfolgen (die sehr häufig sind).

Eine Sache zu beachten: Verschlüsselung funktioniert im Allgemeinen auf beliebigen Binärdaten und das Ergebnis ist beliebige binäre Daten. Do not versuchen, die Ergebnisse der Verschlüsselung zurück in eine Zeichenfolge mit etwas wie Encoding.UTF8.GetString(bytes) konvertieren - das wird zu Datenverlust führen, da die willkürlichen binären Daten höchstwahrscheinlich keine gültige UTF-8-codierte Folge von Zeichen sein wird. Wenn Sie ein Zeichenfolgenergebnis benötigen, verwenden Sie die base64-Codierung: Convert.ToBase64String(bytes).