Decodificar Base64 (2) T77863


Statement
 

pdf   zip

thehtml

(Este problema utiliza la función char\_to\_base64 del problema "Decodificar Base64 (1)".)

Se trata de hacer un programa que, dada una secuencia de caracteres en la entrada (uno de los 64 que representan los dígitos de base 64), la decodifique en sus bytes. La decodificación funciona de la siguiente manera:

  1. Primero, para cada grupo de 4 caracteres (o cuarteto) de la entrada c1, c2, c3 y c4, los transformamos en sus dígitos correspondientes d1, d2, d3, d4, usando la función char_to_base64.

  2. Después, con los 4 dígitos di reconstruimos el natural x aplicando la fórmula:

    x = ((d1 · 64 + d2) · 64 + d3) · 64 + d4

  3. A continuación, reinterpretamos x en base 256, y extraemos las cifras, que ahora son 3: B1, B2, y B3. El proceso es totalmente análogo a extraer las cifras de un número en base 10, pero en base 256. Lo que habremos hecho es calcular los dígitos Bi de la fórmula siguiente:

    x = (B1 · 256 + B2) · 256  + B3

    (Hay que recordar que el proceso de extracción de las cifras trabajado en PRO1 produce las cifras al revés, comenzando por B3)

  4. Finalmente, mostramos B1, B2 y B3 como números naturales por pantalla, en este orden.

La codificación en base 64 siempre tiene un número de caracteres múltiplo de 4, pero justo al final de la secuencia puede haber ’=’ o ’==’, que nos dice que el número de bytes del último cuarteto son 2 o 1, y no 3:

Si el último cuarteto tiene algún ’=’ al final:

  • Si tiene ’==’: el número de bytes será 1; asignamos d3 = 0 y d4 = 0, decodificamos según los pasos anteriores, pero solo mostramos B1 por pantalla.

  • Si tiene ’=’: el número de bytes es 2; asignamos d4 = 0, decodificamos según los pasos anteriores, pero solo mostramos B1 y B2 por pantalla.

Entrada

La entrada consiste en varios casos, donde cada caso es una secuencia de caracteres base 64 en la misma línea y con un punto al final.

Salida

La salida debe ser una línea para cada caso con los bytes como números naturales. Antes de cada byte, incluido el primero, debe haber un espacio.

Observación

  • Este problema tiene como centros de interés la corrección y la legibilidad. En particular, se valorará que el programa utilice funciones para evitar repetición y separar las diversas tareas.

  • Si tenéis la función char_to_base64 y el Juez os la ha aceptado, usadla directamente. Si no, copiad la siguiente definición, (y añadid #include <algorithm>):
    int char_to_base64(char c) {
        static char _syms[65] =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz"
            "0123456789+/";
        return std::find(_syms, _syms + 64, c) - _syms;
    }
    
Public test cases
  • Input

    AAAA.
    AQEB.
    AgIC.
    ////.
    AA==.
    AAA=.
    AQ==.
    AQE=.
    ZGRkZA==.
    CgAUAB4=.
    ////AAAA.
    

    Output

     0 0 0
     1 1 1
     2 2 2
     255 255 255
     0
     0 0
     1
     1 1
     100 100 100 100
     10 0 20 0 30
     255 255 255 0 0 0
    
  • Input

    LA==.
    Jg==.
    lg==.
    Sg==.
    3Q==.
    Mg==.
    Rw==.
    Ng==.
    BQ==.
    TA==.
    og==.
    

    Output

     44
     38
     150
     74
     221
     50
     71
     54
     5
     76
     162
    
  • Input

    9qE=.
    xpM=.
    b9M=.
    DUk=.
    CH0=.
    rPA=.
    kSk=.
    wV8=.
    bQg=.
    ZvY=.
    

    Output

     246 161
     198 147
     111 211
     13 73
     8 125
     172 240
     145 41
     193 95
     109 8
     102 246
    
  • Input

    u1Zi.
    q6nx.
    NJFe.
    tjy1.
    1Bq2.
    /eRh.
    q0A/.
    2K1L.
    ANVh.
    eg+n.
    

    Output

     187 86 98
     171 169 241
     52 145 94
     182 60 181
     212 26 182
     253 228 97
     171 64 63
     216 173 75
     0 213 97
     122 15 167
    
  • Information
    Author
    Pau Fernández
    Language
    Spanish
    Translator
    Original language
    Catalan
    Other languages
    Catalan
    Official solutions
    C++
    User solutions
    C++