2010-10-26 39 views
19

¿Hay alguna manera de utilizar ASCIIEncoding en Windows Phone 7?ASCIIEncoding En Windows Phone 7

A menos que esté haciendo algo mal no existe y lo estoy necesitando para el cifrado C# -> PHP (ya que PHP solo usa ASCII en el cifrado SHA1).

¿Alguna sugerencia?

+0

¿Cómo se relacionan los estándares de codificación de caracteres con encyrption? Según tengo entendido, SHA1 (o cualquier otro algoritmo hash) toma una secuencia de bytes y genera un hash (también una secuencia corta de bytes). ¿Dónde ingresa la codificación de caracteres a la ecuación? – AnthonyWJones

+0

Actualmente, la generación de un hash en C# (para WP7) (Unicode) genera un hash diferente al que PHP genera (ASCII). Vi otra pregunta aquí diciendo que usar 2 codificaciones diferentes genera 2 hachís diferentes. – Dean

Respuesta

44

Es fácil de aplicar a sí mismo, Unicode nunca se metió con los códigos 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

Gracias, lo intentaré ... – Dean

+1

Gracias, trabaje perfectamente. – Dean

0

De acuerdo con este foro de MS thread, Windows Phone 7 no es compatible con .

+0

Bueno, ¿hay otras formas de evitar esto (E.G. Custom Class o Library)? ¿O el propio Framework tiene que soportar ASCII? – Dean

4

No ver realmente ningún detalle en su pregunta, esto podría ser un error. Tiene razón Silverlight no admite la codificación ASCII.

Sin embargo, sospecho que, de hecho, UTF8 hará lo que necesita. Vale la pena tener en cuenta que una secuencia de caracteres solo ASCII de byte único y el mismo conjunto de caracteres codificados como UTF-8 son idénticos. Ese es el conjunto de caracteres ASCII completo que se repite al pie de la letra por los primeros 128 puntos de código de un solo byte en UTF-8.

+3

+1. UTF8 funcionará si quiere ASCII – db42

3

Tengo una aplicación Silverlight que escribe archivos CSV, que tienen que ser codificado en ASCII (con UTF-8 provoca acentuada caracteres que aparecen mal cuando abre los archivos en Excel).

Dado que Silverlight no tiene una clase Encoding.ASCII, implementé una de las siguientes. Funciona para mí, espero que sea útil para usted, así:

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

tuve un problema similar usando Xamarin (Mono) para Android donde yo estoy usando la biblioteca de clases portátiles y no son compatibles con Econding.ASCII.

En cambio, la única solución de trabajo (excepto hacerlo manualmente) es éste

Uri.EscapeDataString(yourString); 

Ver this answer que proporcionan información adicional.

1

que partió de respuesta @Hans Passant 's y me volvió a escribir con 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(); 
} 

Es posible que desee quitar la llamada a ToArray() y devolver una IEnumerable<byte> en lugar de byte[].

+0

Más elegante, pero probablemente mucho menos eficiente que el enfoque de Hans. A veces es difícil superar el rendimiento de un bucle 'for' puro. –