2010-10-26 7 views
19

Existe-t-il un moyen d'utiliser ASCIIEncoding dans Windows Phone 7?ASCIIEncoding Dans Windows Phone 7

À moins que je ne fasse quelque chose de mal n'existe pas et j'en ai besoin pour le cryptage C# -> PHP (car PHP utilise uniquement l'ASCII dans le cryptage SHA1).

Des suggestions?

+0

Comment les normes de codage de caractères sont-elles liées à l'encyrption? Si je comprends bien, SHA1 (ou tout autre algorithme de hachage) prend un flux d'octets et génère un hachage (également une courte séquence d'octets). Où l'encodage de caractères entre-t-il dans l'équation? – AnthonyWJones

+0

Générer un hachage en C# (pour WP7) (Unicode) génère un hash différent de celui généré par PHP (ASCII). J'ai vu une autre question ici disant que l'utilisation de 2 encodages différents génère 2 hachages différents. – Dean

Répondre

44

Il est facile de vous mettre en œuvre, Unicode jamais sali avec les codes ASCII:

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

Merci, je vais essayer ... – Dean

+1

Merci, travaillez parfaitement. – Dean

0

Selon ce forum MS thread, Windows Phone 7 ne prend pas en charge .

+0

Eh bien, existe-t-il d'autres façons de contourner ce problème (classe ou bibliothèque personnalisée E.G.)? Ou le Framework lui-même doit-il supporter l'ASCII? – Dean

4

Ne voyant vraiment aucun détail dans votre question, cela pourrait être hors piste. Vous avez raison Silverlight ne supporte pas le codage ASCII.

Cependant, je soupçonne que, en fait, UTF8 fera ce dont vous avez besoin. Il convient de garder à l'esprit qu'une séquence de caractères ASCII à un seul octet et le même jeu de caractères codés en UTF-8 sont identiques. C'est à dire que le jeu de caractères ASCII complet est répété mot pour mot par les 128 premiers points de code à un octet en UTF-8.

+3

+1. UTF8 fera si vous voulez ASCII – db42

3

J'ai une application Silverlight qui écrit des fichiers CSV, qui doivent être codées en ASCII (en UTF-8 provoque accentués caractères à montrer mal quand vous ouvrez les fichiers dans Excel).

Comme Silverlight n'a pas de classe Encoding.ASCII, j'en ai implémenté une comme suit. Il fonctionne pour moi, l'espoir qu'il est utile de vous aussi:

/// <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

J'ai eu le même problème en utilisant Xamarin (Mono) pour Android où j'utilise la bibliothèque de classes portable et ils ne prennent pas en charge Econding.ASCII.

Au lieu de cela, la seule solution de travail (sauf le faire manuellement) est celui

Uri.EscapeDataString(yourString); 

Voir this answer qui fournissent des informations supplémentaires.

1

Je suis parti de la réponse de @Hans et je réécrit Passant avec 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(); 
} 

Vous pouvez supprimer l'appel à ToArray() et retourner un IEnumerable<byte> au lieu de byte[].

+0

Plus élégant, mais probablement beaucoup moins efficace que l'approche de Hans. Parfois, il est difficile de battre la performance d'une boucle «for» brute. –