2010-07-09 20 views
7

Estoy tratando de construir una combinación de oraciones/letras que devolverá cada carácter de base64, pero no encontrar una palabra para fines de prueba unitaria.Oración que utiliza todos los caracteres de base64

Las pruebas de unidad que he realizado hasta ahora no han llegado a las líneas que manejan los caracteres + y /. Si bien puedo colgarlos en el codificador/decodificador directamente, sería bueno tener una fuente legible para humanos (el equivalente en base64 de 'el perro marrón rápido').

+0

Hm ... El problema que veo aquí es que la sentencia tendrá ser largo y por lo tanto puede ser mal escrito. Y si no lo escribe, pero copie y pegue, puede usar cualquier cadena generada adecuada. – sharptooth

+0

Pero si tratas de trabajar hacia atrás e incorporar los caracteres + y /, obtienes caracteres con diéresis, etc. o no imprimibles que no son útiles para pasar en una prueba unitaria. –

Respuesta

9

Aquí es una cadena de prueba codificada Base64 que incluye todos los 64 posibles símbolos Base64:

char base64_encoded_test[] = 
"U28/PHA+VGhpcyA0LCA1LCA2LCA3LCA4LCA5LCB6LCB7LCB8LCB9IHRlc3RzIEJhc2U2NCBlbmNv" 
"ZGVyLiBTaG93IG1lOiBALCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBJLCBKLCBLLCBMLCBNLCBO" 
"LCBPLCBQLCBRLCBSLCBTLCBULCBVLCBWLCBXLCBYLCBZLCBaLCBbLCBcLCBdLCBeLCBfLCBgLCBh" 
"LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzLg=="; 

char base64url_encoded_test[] = 
"U28_PHA-VGhpcyA0LCA1LCA2LCA3LCA4LCA5LCB6LCB7LCB8LCB9IHRlc3RzIEJhc2U2NCBlbmNv" 
"ZGVyLiBTaG93IG1lOiBALCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBJLCBKLCBLLCBMLCBNLCBO" 
"LCBPLCBQLCBRLCBSLCBTLCBULCBVLCBWLCBXLCBYLCBZLCBaLCBbLCBcLCBdLCBeLCBfLCBgLCBh" 
"LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzLg=="; 

Decodifica a una cadena compuesta enteramente de texto relativamente legible:

char test_string[] = "So?<p>" 
    "This 4, 5, 6, 7, 8, 9, z, {, |, } tests Base64 encoder. " 
    "Show me: @, A, B, C, D, E, F, G, H, I, J, K, L, M, " 
    "N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \\, ], ^, _, `, " 
    "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s."; 

Este decodificado string contiene solo letras en el rango limitado de isprint() 'capaz de caracteres ASCII de 7 bits (espacio a través de' ~ ').

Desde que lo hice, yo diría que es posible :-).

+0

Tendré que verificar esto cuando llegue a casa el fin de semana. –

+0

Sorprendido, el \ no necesita escaparse en la cadena de prueba. –

+0

oops. Sí, necesito duplicar la barra diagonal inversa para escapar si quiero poner esta cadena de prueba en mi código fuente (pero no si la leo desde un archivo). Fijo. –

1

Probablemente no pueda hacer eso.

/ en base64 codifica 111111 (6 '1' bits).

Como todos ASCII (que son los caracteres de tipo-capaz e imprimibles) están en el intervalo de 0-127 (es decir 00000000 y 01111111), el único carácter ASCII que podría ser codificado utilizando '/' es el carácter ASCII con el código 127, que es el carácter no imprimible DEL.

Si permite valores superiores a 127, podría tener una cadena imprimible pero no tipable.

1

Al intentar codificar/descodificar, este es el único lugar donde rompo la regla de probar un solo método a la vez. Puede tener métodos para codificar o decodificar por separado, pero la única forma de saber si lo está haciendo correctamente es usar codificación y decodificación en una sola afirmación. Usaría el siguiente código psuedo.

Generate a random string using Path.GetRandomFilename() this string is cryptographically strong 
Pass the string to the encode method 
Pass the output of the encode to the decode method 
Assert.AreEqual(input from GetRandomFilename, output from Decode) 

Puede repetir esto tantas veces como desee para decir que se ha probado. También puedes cubrir algunos casos específicos; sin embargo, dado que la codificación (a veces) difiere en función del posicionamiento de las letras, es mejor ir con una cadena aleatoria y llamar codificar/descodificar unas 50 veces.

Si ve que la codificación/decodificación falla en los escenarios aceptados, cree pruebas unitarias para ellos y filtre las cadenas que contienen esas combinaciones de caracteres/caracteres. Además, documente las fallas en los comentarios de XMLDocs, los comentarios del código y cualquier documentación que tenga su aplicación.

+0

En realidad estoy usando algunas cadenas largas de RFC3548. Como esto es solo texto en inglés, el rango de caracteres es limitado. –

0

Lo que se me ocurrió, puede resultar no inútil. Debe escribirse exactamente como está: incluyo un enlace a una captura de pantalla que muestra todos los caracteres usualmente invisibles a continuación, así como la cadena de datos Base64 a la que convierte, y una tabla de las estadísticas relevantes relacionadas con cada uno de los 64 caracteres que contiene .


  <HTML><HEAD></HEAD><BODY><PRE> 
      Did 

      THE  

       THE QUICK BROWN FOX 

       jump 

       over  

       the  

        lazy 

        dogs 

        or 

        was  

         he  

         pushed 

         ? 

      </PRE><B>hmm.</B></BODY><HTML> 






      ÿß®Þ~c*¯/ 

Este codifica para la cadena Base64:

  PEhUTUw+PEhFQUQ+PC9IRUFEPjxCT0RZPjxQUkU+DQpEaWQJDQoNCiBUSEUJDQoNCiAgVEhFIFFVSUNLIEJST1dOIEZPWAkNCg0KICAganVtcAkNCg0KICAgIG92ZXIJDQoNCiAgICAgdGhlCQ0KDQogICAgICBsYXp5CQ0KDQogICAgICAgZG9ncwkNCg0KICAgICAgICBvcgkNCg0KICAgICAgICAgd2FzCQ0KDQogICAgICAgICAgaGUJDQoNCiAgICAgICAgICAgcHVzaGVkCQ0KDQogICAgICAgICAgICA/CQ0KDQo8L1BSRT48Qj5obW0uPC9CPjwvQk9EWT48SFRNTD4NCg0KDQoNCg0KDQoNCg//367efmMqry/== 

que contiene

  5--/'s 
      4--+'s 
      3--='s 
      14--0's 
      3--1's 
      3--2's 
      2--3's 
      4--4's 
      3--5's 
      2--6's 
      2--7's 
      4--8's 
      6--9's 
      5--a's 
      27--A's 
      2--b's 
      5--B's 
      5--c's 
      4--C's 
      4--d's 
      14--D's 
      2--e's 
      10--E's 
      2--f's 
      8--F's 
      36--g's 
      6--G's 
      5--h's 
      2--H's 
      5--i's 
      30--I's 
      5--j's 
      6--J's 
      8--k's 
      12--K's 
      2--l's 
      3--L's 
      2--m's 
      4--M's 
      3--n's 
      14--N's 
      13--o's 
      2--O's 
      3--p's 
      9--P's 
      2--q's 
      24--Q's 
      2--r's 
      5--R's 
      2--s's 
      6--S's 
      2--t's 
      7--T's 
      2--u's 
      1--U's 
      3--v's 
      6--V's 
      4--w's 
      5--W's 
      3--x's 
      6--X's 
      2--y's 
      4--Y's 
      3--z's 
      5--Z's 
+0

oops forgot link to screenshot que muestra invisibles: http://anony.ws/image/kbWa –

Cuestiones relacionadas