2011-12-14 55 views
5

Si quiero escribir un cifrado César C# ¿tengo que pasar por cada caso? No tiene sentido para mí convertir a ASCII o UTF (probablemente porque no entiendo cómo funcionaría). Solo necesito un punto en la dirección correcta.Cifrado César en C#

¿Debo asignarle a cada letra los números del 1 al 26?

Respuesta

2

Puede poner cada letra en una matriz y usar el índice de matriz (envolviendo al final) o simplemente puede usar el valor de asccii de la letra y ajustar el primero al llegar al último. El truco aquí es que todos los personajes están ordenados coninuously, a partir de A = 0x41

+0

¡Gracias! Esto tiene sentido para mí, no me di cuenta de que podía hacer eso (¡soy un principiante completo!). –

1

Para una César César tradicional, usted verificaría que un carácter estaba en el rango [a-z] o [A-Z], y simplemente hágalo de otra manera.

Una alternativa es tratar a todos los caracteres de la misma manera, así que no solo convierte a b, sino que μ se convierte en ¶ y se envuelve en U + 10FFFF (el punto de código más alto en Unicode) se convierte en U + 0000 (el anterior es un carácter y el último un carácter nulo, pero no hay razón por la cual un string no puede contenerlos para transmitir a otro lugar.

Entre esos dos, es actuar sobre el UTF-16. , solo agregue 1 al valor de cada char y ajuste U + FFFF hasta U + 0000. La salida podría convertirse en una cadena UTF-16 no válida (porque podría haber coincidido mal con surrogates, pero eso no le impediría de pasarlo en un string, y luego descifrarlo de nuevo. Después de todo, el cifrado moderno tampoco da como resultado cadenas válidas.

+0

Esto es lo que no entiendo, si quiero descifrar una frase simple y convertirlo en código puedo limitar el rango de modo que cuando quiero 'z' a ser 'b' por ejemplo, ¿siempre tengo que ir y venir? ¿No puedo hacerlo análogo a una rueda? Y gracias por la respuesta. –

+0

Esa es una cuestión de especificaciones más que de trabajo (lamentablemente, la mayoría de las complicaciones de la vida real son así también, la programación es más fácil que resolver lo que el cliente realmente quiere). Yo diría que el primero es * probablemente * lo que se pretendía. ¿Qué quiere decir con "no análogo a una rueda", cualquier variante de una cifra César es análoga a una rueda. –

+0

Me refiero a envolver, como descubrí en otra respuesta =) - Debería haber escrito _no puedo hacerlo de forma análoga_. Todavía me estoy acostumbrando a los términos. –

2

Tal vez lanzar indirectas serían útiles - usted dice que no desea copiar o se les diga la respuesta:

  • Considérese que C# presenta el operador de módulo, en la forma a = b% c - es decir, el resto de b dividido por c. Cuando c = n y b = n, a = 0. Cuando c = n y b = n + 1, a = 1. Experimenta con el comportamiento de este operador.
  • Se puede declarar matrices de forma estática en C# con inicializadores: char[] chars = new char[]{'a', 'b',...};
+0

¡También una gran ayuda, gracias! –

1

Este es mi enfoque.

public static string Encrypt(string str, int n) 
    { 
     return string.Join("", str.Select(x => Encrypt(x, n))); 
    } 

    public static string Decrypt(string str, int n) 
    { 
     return string.Join("", str.Select(x => Decrypt(x, n))); 
    } 

    public static char Encrypt(char chr, int n) 
    { 
     int x = chr - 65; 

     return (char)((65) + ((x + n) % 26)); 
    } 

    public static char Decrypt(char chr, int n) 
    { 
     int x = chr - 65; 

     return (char)((65) + ((x - n) % 26)); 
    } 

P.S.

Funciona solo para letras mayúsculas.

Lea el artículo de Wikipedia: Caesar cipher