2010-10-26 13 views
19

Gibt es eine Möglichkeit, ASCIIEncoding in Windows Phone 7 zu verwenden?ASCIIEncoding In Windows Phone 7

Wenn ich nicht etwas falsch mache existiert nicht und ich brauche es für C# -> PHP-Verschlüsselung (wie PHP nur ASCII in SHA1-Verschlüsselung verwendet).

Irgendwelche Vorschläge?

+0

Wie wirken sich Zeichencodierungsstandards auf die Verschlüsselung aus? Wie ich es verstehe, nimmt SHA1 (oder ein anderer Hash-Algorithmus) einen Strom von Bytes und erzeugt einen Hash (auch eine kurze Folge von Bytes). Wo tritt die Zeichencodierung in die Gleichung ein? – AnthonyWJones

+0

Gegenwärtig erzeugt das Generieren eines Hashs in C# (für WP7) (Unicode) einen anderen Hashwert, für den PHP generiert (ASCII). Ich sah eine andere Frage hier, die sagte, dass die Verwendung von 2 verschiedenen Kodierungen 2 verschiedene Hashes generiert. – Dean

Antwort

44

Es ist einfach, sich selbst zu implementieren, Unicode nie mit den ASCII-Codes durcheinander:

public static byte[] StringToAscii(string s) { 
     byte[] retval = new byte[s.Length]; 
     for (int ix = 0; ix < s.Length; ++ix) { 
      char ch = s[ix]; 
      if (ch <= 0x7f) retval[ix] = (byte)ch; 
      else retval[ix] = (byte)'?'; 
     } 
     return retval; 
    } 
+0

Danke, Ill geben Sie es ein ... – Dean

+1

Danke, Arbeit perfekt. – Dean

0

Nach diesem MS-Forum thread unterstützt Windows Phone 7 nicht.

+0

Nun, gibt es andere Möglichkeiten, um diese (E.G. Custom Class oder Library)? Oder muss das Framework selbst ASCII unterstützen? – Dean

4

Nicht wirklich jedes Detail in Ihrer Frage zu sehen, könnte dies von der Spur sein. Sie haben Recht Silverlight unterstützt die ASCII-Codierung nicht.

Allerdings vermute ich, dass in der Tat UTF8 tun wird, was Sie brauchen. Es lohnt sich, daran zu denken, dass eine Folge von Ein-Byte-Nur-ASCII-Zeichen und der gleiche Satz von Zeichen, die als UTF-8 codiert sind, identisch sind. Das heißt, der komplette ASCII-Zeichensatz wird wörtlich von den ersten 128 Single-Byte-Codepunkten in UTF-8 wiederholt.

+3

+1. UTF8 wird tun, wenn Sie wollen ASCII – db42

3

ich eine Silverlight-Anwendung, die CSV-Dateien schreibt, die in ASCII codiert werden müssen (unter Verwendung von UTF-8 akzentuierte verursacht Zeichen, die falsch angezeigt werden, wenn Sie die Dateien in Excel öffnen).

Da Silverlight keine Klasse Encoding.ASCII hat, habe ich eine wie folgt implementiert. Es funktioniert für mich, hoffe, es Ihnen auch nützlich ist:

/// <summary> 
/// Silverlight doesn't have an ASCII encoder, so here is one: 
/// </summary> 
public class AsciiEncoding : System.Text.Encoding 
{ 
    public override int GetMaxByteCount(int charCount) 
    { 
     return charCount; 
    } 
    public override int GetMaxCharCount(int byteCount) 
    { 
     return byteCount; 
    } 
    public override int GetByteCount(char[] chars, int index, int count) 
    { 
     return count; 
    } 
    public override byte[] GetBytes(char[] chars) 
    { 
     return base.GetBytes(chars); 
    } 
    public override int GetCharCount(byte[] bytes) 
    { 
     return bytes.Length; 
    } 
    public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) 
    { 
     for (int i = 0; i < charCount; i++) 
     { 
      bytes[byteIndex + i] = (byte)chars[charIndex + i]; 
     } 
     return charCount; 
    } 
    public override int GetCharCount(byte[] bytes, int index, int count) 
    { 
     return count; 
    } 
    public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) 
    { 
     for (int i = 0; i < byteCount; i++) 
     { 
      chars[charIndex + i] = (char)bytes[byteIndex + i]; 
     } 
     return byteCount; 
    } 
} 
1

ich für Android ähnliches Problem mit Xamarin (Mono), wo ich Portable Klassenbibliothek bin mit und sie nicht unterstützen Econding.ASCII.

Stattdessen die einzige funktionierende Lösung (außer es manuell zu tun) ist dies eine

Uri.EscapeDataString(yourString); 

this answer Sie, welche zusätzliche Informationen zur Verfügung stellen.

1

Ich begann von @Hans Passant ‚s Antwort und ich schrieb es mit Linq:

/// <summary> 
/// Gets an encoding for the ASCII (7-bit) character set. 
/// </summary> 
/// <see cref="http://stackoverflow.com/a/4022893/1248177"/> 
/// <param name="s">A character set.</param> 
/// <returns>An encoding for the ASCII (7-bit) character set.</returns> 
public static byte[] StringToAscii(string s) 
{ 
    return (from char c in s select (byte)((c <= 0x7f) ? c : '?')).ToArray(); 
} 

Sie können das Gespräch ToArray() und geben einen IEnumerable<byte> statt byte[] zu entfernen.

+0

Eleganter, aber wahrscheinlich weniger effizient als Hans Ansatz. Manchmal ist es schwer, die Leistung einer rohen For-Schleife zu übertreffen. –