• No se han encontrado resultados

TRABAJO PRACTICO Nº 1 Traductor ASCII / BASE64

N/A
N/A
Protected

Academic year: 2021

Share "TRABAJO PRACTICO Nº 1 Traductor ASCII / BASE64"

Copied!
7
0
0

Texto completo

(1)

TRABAJO PRACTICO Nº 1 – Traductor ASCII / BASE64

1) Objetivo del T.P.:

El objetivo del presente trabajo consiste en la realización de un aplicativo en modo consola que convierta un texto recibido por stdin (Standard Input) escrito en alfabeto ASCII en otro texto generado sobre stdout (Standard Output) en sistema de codificación Base 64, y viceversa.

2) Desarrollo del T.P.:

Para el presente T.P. se deberán construir dos (2) programas ejecutables invocables por línea de comandos:

• Encoder: convertirá un texto compuesto por símbolos del alfabeto ASCII (caracteres) a otro idéntico en contenidos pero compuesto por símbolos del alfabeto BASE 64.

• Decoder: convertirá un texto compuesto por símbolos del alfabeto B64 a otro idéntico en contenidos pero compuesto por símbolos (caracteres) del alfabeto ASCII.

El programa Encoder, materializado sobre un archivo ejecutable denominado "ascii2b64.exe" deberá ser invocado de la siguiente forma:

type textoASCII.txt | ascii2b64>textoB64.txt (DOS) cat textoASCII.txt | ascii2b64>textoB64.txt (UNIX)

(2)

El programa Decoder, materializado sobre un archivo ejecutable denominado "b642ascii.exe" deberá ser invocado de la siguiente forma:

type textoB64.txt | b642ascii>textoASCII.txt (DOS) cat textoB64.txt | b642ascii>textoASCII.txt (UNIX)

en donde "textoB64.txt" y "textoASCII.txt" son dos archivos de texto usados como ejemplo, conteniendo símbolos de los alfabetos B64 y ASCII, respectivamente.

3) Restricciones:

La realización de ambos programas está sujeta a las siguientes restricciones:

• No está permitido almacenar en memoria la totalidad de los caracteres leídos de stdin (además, tampoco hace falta).

• No está permitida la utilización de memoria dinámica.

• No está permitida la utilización de funciones específicas para manejo de archivos de texto, que no sean fgetc(), getchar(), scanf(), printf() ,putc(),y fputc().

• Los caracteres deben ser leídos de a uno a la vez, i.e., no está permitido leer cadenas de caracteres de longitud arbitraria, ya que se desconoce su longitud, y no se puede hacer ninguna suposición previa.

• Hay otras cuestiones que no han sido especificadas intencionalmente en este Requerimiento, para darle al Desarrollador la libertad de elegir implementaciones que, según su criterio, resulten más favorables en determinadas situaciones. Por lo tanto, se debe explicitar cada una de las decisiones tomadas, y el o los fundamentos considerados para las mismas.

Base64 Encoding Table

Value Char Value Char Value Char Value Char 0 A 16 Q 32 g 48 w 1 B 17 R 33 h 49 x 2 C 18 S 34 i 50 y 3 D 19 T 35 j 51 z 4 E 20 U 36 k 52 0 5 F 21 V 37 l 53 1 6 G 22 W 38 m 54 2

(3)

15 P 31 f 47 v 63 / 4) Entrega del Trabajo Práctico:

a) Deberá presentarse la correspondiente Documentación de desarrollo del TP, incluyendo:

• estructura lógica y funcional de los programas desarrollados; diagramas de flujo.

• explicación de las alternativas consideradas y estrategias adoptadas.

• resultados de la ejecución (corridas) del programa, captura de las pantallas, bajo condiciones normales y anómalas de funcionamiento.

• reseña sobre los problemas encontrados en el desarrollo del programa y las soluciones implementadas para subsanarlos.

b) Deberá entregarse los fuentes (implementación y headers) de los programas desarrollados. NO entregar archivos de códigos objeto y/o ejecutables.

c) Deberá entregarse un archivo script de compilación (archivo BAT[DOS] o SH/KSH[UNIX]) que indique cómo deben ser compilados los códigos fuentes del punto b) mediante el compilador C GCC/DJGPP.

5) Bibliografía:

Debe incluirse la referencia a toda bibliografía consultada para la realización del presente TP: libros, artículos, URLs, etc., citando:

• Denominación completa del material (Título, Autores, Edición, Volumen, etc.).

• Código ISBN del libro (opcional: código interbibliotecario).

• URL del sitio consultado.

(4)

Anexo: Reglas para la codificación base64

Reglas para la codificación base64

i) Codificación

Consideremos que un byte es un sistema de representación "base256", ya que un byte (8 bits), puede representar 256 elementos diferentes.

Entonces siguiendo esta línea de razonamiento, la codificación de un texto ASCII a un texto base64 se reduce a una conversión entre dos sistemas de distinta base, es decir que represento la misma información pero con distinta cantidad de

símbolos. Así, la codificación base64 tiene 64 símbolos, más un símbolo de relleno.

La siguiente tabla contiene a los símbolos utilizados por esta forma de codificación.

Hex Dec Hex Dec Hex Dec Hex Dec 0x0 0 A 0x10 16 Q 0x20 32 g 0x30 48 w 0x1 1 B 0x11 17 R 0x21 33 h 0x31 49 x 0x2 2 C 0x12 18 S 0x22 34 i 0x32 50 y 0x3 3 D 0x13 19 T 0x23 35 j 0x33 51 z 0x4 4 E 0x14 20 U 0x24 36 k 0x34 52 0 0x5 5 F 0x15 21 V 0x25 37 l 0x35 53 1 0x6 6 G 0x16 22 W 0x26 38 m 0x36 54 2 0x7 7 H 0x17 23 X 0x27 39 n 0x37 55 3 0x8 8 I 0x18 24 Y 0x28 40 o 0x38 56 4 0x9 9 J 0x19 25 Z 0x29 41 p 0x39 57 5 0xA 10 K 0x1A 26 a 0x2A 42 q 0x3A 58 6 0xB 11 L 0x1B 27 b 0x2B 43 r 0x3B 59 7 0xC 12 M 0x1C 28 c 0x2C 44 s 0x3C 60 8 0xD 13 N 0x1D 29 d 0x2D 45 t 0x3D 61 9 0xE 14 O 0x1E 30 e 0x2E 46 u 0x3E 62 + 0xF 15 P 0x1F 31 f 0x2F 47 v 0x3F 63 /

y el signo "=" utilizado como relleno, es decir que este signo no representa una combinación de bits, sino que se utiliza para casos particulares.

El texto codificado en base 64 debe fraccionarse en líneas de 76 caracteres.

Resumiendo, hay un sistema de 256 símbolos que debe representarse en un sistema de 64 símbolos.

(5)

En el siguiente ejemplo se fracciona una secuencia de 3 bytes en 4 grupos de 6 bits.

Se utiliza el carácter '|' como separador entre los grupos de 8 bits y de 6 bits.

|0 1 1 0 0 1 0 1|0 1 1 0 1 0 1 0|0 1 0 0 1 1 0 0|

|0 1 1 0 0 1|0 1 0 1 1 0 1|0 1 0 0 1 0|0 1 1 0 0|

Cada uno de los grupos de 6 bits representa un valor de 0 a 63, y es este valor el que indica qué carácter debe imprimirse en la salida codificada.

i.1 Casos particulares

Los casos particulares son los siguientes:

i.1.1 La cantidad de caracteres a codificar es múltiplo de 3:

En este caso simplemente la codificación se cierra con los caracteres correspondientes a los últimos 3 bytes leídos.

i.1.2 La cantidad de caracteres a codificar es uno más que un múltiplo de 3

En este caso se codificarán normalmente los 3 anteúltimos bytes, y quedará solo un byte a codificar. Cómo el código requiere 24 bits para así formar 4 símbolos, los 16 bits faltantes se rellenan con 0.

De estos 24 bits así obtenidos, los primeros 12 se codifican normalmente, obteniéndose dos símbolos. Los últimos 12 no se codifican, y en su lugar se imprime el carácter de relleno "=".

Ej:

| ultimo byte |<--- relleno con '0' --->|

|0 1 1 0 0 1 0 1|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|

|0 1 1 0 0 1|0 1 0 0 0 0|0 0 0 0 0 0|0 0 0 0 0 0|

|<--- Se codifica --->|<---no se codifica --->|

| 'Z' | 'Q' | '=' | '=' |

i.1.3 La cantidad de caracteres a codificar es dos más que un múltiplo de 3:

En este caso se codificarán normalmente los 3 anteúltimos bytes, y quedarán dos bytes a codificar. Al igual que el caso anterior, deben completarse 24 bits, de los cuales solo se tienen 16. Entonces los siguientes 8 se completan con 0.

De estos 24 bits así obtenidos, los primeros 18 se codifican normalmente, y los últimos 6 no se codifican, y en su lugar se imprime el carácter de relleno "=".

Ej:

| últimos dos bytes |<- relleno con |

| | '0' ->|

|0 1 1 0 0 1 0 1|0 1 1 0 1 0 1 0|0 0 0 0 0 0 0 0|

|0 1 1 0 0 1|0 1 0 1 1 0|1 0 1 0 0 0|0 0 0 0 0 0|

|<--- Se codifica --->|<---no se codifica --->|

| 'Z' | 'Q' | 'o' | '=' |

(6)

Ejemplo de codificación:

Texto e entrada:

HOLA

Valores ASCII:

0x48 0x4F 0x4C 0x41

En binario:

|0 1 0 0 1 0 0 0|0 1 0 0 1 1 1 1|0 1 0 0 1 1 0 0|0 1 0 0 0 0 0 1|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|

Agrupados de a 6 bits:

|0 1 0 0 1 0|0 0 0 1 0 0|1 1 1 1 0 1|0 0 1 1 0 0|0 1 0 0 0 0|0 1 0 0 0 0|< -- NO SE CODIFICA -->|

Valores hexadecimales de cada unidad de 6 bits:

0x12 0x04 0x3D 0x0C 0x10 0x10 |<-- NO SE CODIFICA -->|

Caracteres de la tabla base64:

'S' 'E' '9' 'M' 'Q' 'Q' '=' '='

Entonces si en el codificador se ingresa "HOLA" se debe imprimir

"SE9MQQ=="

ii) Decodificación

Para la decodificación se opera exactamente a la inversa:

Se leen cuatro caracteres, estos se convierten al número que representan en la tabla base64, el cual se corresponde con una secuencia de 6 bits. Se forma así un grupo de 24 bits.

Este grupo de 24 bits se fracciona en 3 grupos de 8 bits, los cuales corresponden al valor ASCII del caracter decodificado.

Dentro del texto codificado no puede haber signos que no estén incluidos en la tabla de caracteres base64, y tampoco puede estar el signo '=' dentro del texto, el cual solo puede estar en el último o en los dos últimos caracteres, siendo la cantidad de caracteres múltiplo de 4.

Ejemplo:

(7)

En este caso hay un byte de relleno puesto por el codificador. Entonces de los últimos 24 bits se decodifican solo los primeros 16, correspondientes a dos

caracteres ASCII, mientras que los últimos 8 bits no se decodifican ya que son de relleno.

ii.1.3 El texto ingresado contiene dos signos '='como últimos caracteres

En este caso hay dos bytes de relleno puestos por el codificador. Entonces de los últimos 24 bits se decodifican solo los primeros 8, correspondientes a un

carácter ASCII, mientras que los últimos 16 no se decodifican ya que son de relleno.

Para el ejemplo visto, la decodificación sería:

Texto de entrada:

SE9MQQ== (8 caracteres)

'S' 'E' '9' 'M' 'Q' 'Q' '=' '='

Se busca el valor de esos caracteres en la tabla base64:

0x12 0x04 0x3D 0x0C 0x10 0x10 |<-- NO SE DECODIFICA -->|

En binario, de a 6 bits:

|0 1 0 0 1 0|0 0 0 1 0 0|1 1 1 1 0 1|0 0 1 1 0 0|0 1 0 0 0 0|0 1 0 0 0 0|<-- NO SE CODIFICA -->|

Agrupados de a 8 bits:

|0 1 0 0 1 0 0 0|0 1 0 0 1 1 1 1|0 1 0 0 1 1 0 0|0 1 0 0 0 0 0 1|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|

Como hubo dos signos '=' al final del texto ingresado hay dos bytes que no representan texto, ya que fueron ingresados como relleno en la codificación.

Valores hexadecimales de cada unidad de 8 bits:

0x48 0x4F 0x4C 0x41

Caracteres de la tabla ASCII:

'H' 'O' 'L' 'A'

Referencias

Documento similar

37 El TPI, en los fundamentos jurídicos del 149 al 154 de la sentencia «Virgia- micina», examinó las dos actividades complementarias que integran la evaluación de riesgos:

Se dice que la Administración no está obligada a seguir sus pre- cedentes y puede, por tanto, conculcar legítimamente los principios de igualdad, seguridad jurídica y buena fe,

Fue el desastre industrial más mortífero de la historia de esa ciudad y suposo la introducción de nuevas normas de seguridad y salud laboral en EEUU. Según el informe de los

Fecundación dentro del capullo: capullo + óvulo + esperma = se cierra el limoncillo, puede haber hasta 20 huevos dentro del capullo. El desarrollo es directo, no hay

Y en el caso específico del CEDH, valor orientativo mediado por la jurisprudencia del TEDH (6). El derecho a la inviolabilidad del domicilio que proclama el artículo 18.2 CE

En general, este rol puede realizar cualquier modificación y puede existir más de uno dentro de la plataforma Profesor: puede crear, modificar y borrar actividades o recursos

Puede consultarse el texto completo de la nota informativa para profesionales sanitarios en la web de la AEMPS, dentro de la sección Actividad/alertas de seguridad.. •

de este modo, en un primer momento, por «total» se entendió el reemplazamiento de un texto completo por otro texto completo, hasta que emergió la idea de que un texto completo