Anuncios

Bienvenidos sean a este post, hoy veremos como crear una tabla ASCII con codigo.

Anuncios

Si bien no sera la tabla completa vamos a ver como representar una con los caracteres imprimibles, dado que por el momento no podremos representar a los que son de control pero esto es solo momentaneo, para esto vamos a aplicar todo lo aprendido hasta ahora, nuestro primer paso sera crear un nuevo archivo que llamaremos ascii.c y le agregaremos el siguiente codigo:

ascii.c

#include <stdio.h>

int main()
{
	int c1, c2=32, c3=64, c4=96;

	printf("|Car  Dec  Hex |Car  Dec  Hex |Car  Dec  Hex |\n");
	printf("|--------------|--------------|--------------|\n");

	for(c1=0; c1 < 32; c1++, c2++, c3++, c4++)
	{
		printf("|%c   %3d   %#x|", c2, c2, c2);
		printf("%c   %3d   %#x|", c3, c3, c3);
		printf("%c   %3d   %#x|", c4, c4, c4);
		printf("\n");
	}

	return 0;
}
Anuncios
Anuncios

Este es un codigo simple, primero definiremos cuatro variables, las cuales seran para cada rango de los caracteres, como vimos en este post, despues imprimiremos el encabezado de cada dato que mostraremos, por ultimo usaremos un bucle for que pasara por todos los valores para la tabla ASCII, pero por el momento no utilizamos a c1 sino al resto, recuerden que c1 representa a los caracteres de control y no podemos representarlos, en el bloque mostraremos los tres valores posibles de las variables c2, c3 y c4, es decir del caracter, el valor decimal y el valor hexadecimal, con todo esto comentado compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ascii 
|Car  Dec  Hex |Car  Dec  Hex |Car  Dec  Hex |
|--------------|--------------|--------------|
|     32   0x20|@    64   0x40|`    96   0x60|
|!    33   0x21|A    65   0x41|a    97   0x61|
|"    34   0x22|B    66   0x42|b    98   0x62|
|#    35   0x23|C    67   0x43|c    99   0x63|
|$    36   0x24|D    68   0x44|d   100   0x64|
|%    37   0x25|E    69   0x45|e   101   0x65|
|&    38   0x26|F    70   0x46|f   102   0x66|
|'    39   0x27|G    71   0x47|g   103   0x67|
|(    40   0x28|H    72   0x48|h   104   0x68|
|)    41   0x29|I    73   0x49|i   105   0x69|
|*    42   0x2a|J    74   0x4a|j   106   0x6a|
|+    43   0x2b|K    75   0x4b|k   107   0x6b|
|,    44   0x2c|L    76   0x4c|l   108   0x6c|
|-    45   0x2d|M    77   0x4d|m   109   0x6d|
|.    46   0x2e|N    78   0x4e|n   110   0x6e|
|/    47   0x2f|O    79   0x4f|o   111   0x6f|
|0    48   0x30|P    80   0x50|p   112   0x70|
|1    49   0x31|Q    81   0x51|q   113   0x71|
|2    50   0x32|R    82   0x52|r   114   0x72|
|3    51   0x33|S    83   0x53|s   115   0x73|
|4    52   0x34|T    84   0x54|t   116   0x74|
|5    53   0x35|U    85   0x55|u   117   0x75|
|6    54   0x36|V    86   0x56|v   118   0x76|
|7    55   0x37|W    87   0x57|w   119   0x77|
|8    56   0x38|X    88   0x58|x   120   0x78|
|9    57   0x39|Y    89   0x59|y   121   0x79|
|:    58   0x3a|Z    90   0x5a|z   122   0x7a|
|;    59   0x3b|[    91   0x5b|{   123   0x7b|
|<    60   0x3c|\    92   0x5c||   124   0x7c|
|=    61   0x3d|]    93   0x5d|}   125   0x7d|
|>    62   0x3e|^    94   0x5e|~   126   0x7e|
|?    63   0x3f|_    95   0x5f|   127   0x7f|
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Ahora vamos a modificarlo para que nos muestre la tabla completa, para ello cambiaremos el codigo de la siguiente manera:

#include <stdio.h>

int main()
{
	int c1, c2=32, c3=64, c4=96;

	printf("|Car  Dec  Hex |");
	printf("Car  Dec  Hex |Car  Dec  Hex |Car  Dec  Hex |\n");
	printf("|--------------");
	printf("|--------------|--------------|--------------|\n");

	for(c1=0; c1 < 32; c1++, c2++, c3++, c4++)
	{
		switch(c1)
		{
			case 0:
				printf("|%s  %3d  %#4x", "NUL", c1, c1);
				break;
			case 1:
				printf("|%s  %3d  %#4x", "SOH", c1, c1);
				break;
			case 2:
				printf("|%s  %3d  %#4x", "STX", c1, c1);
				break;
			case 3:
				printf("|%s  %3d  %#4x", "ETX", c1, c1);
				break;
			case 4:
				printf("|%s  %3d  %#4x", "EOF", c1, c1);
				break;
			case 5:
				printf("|%s  %3d  %#4x", "ENQ", c1, c1);
				break;
			case 6:
				printf("|%s  %3d  %#4x", "ACK", c1, c1);
				break;
			case 7:
				printf("|%s  %3d  %#4x", "BEL", c1, c1);
				break;
			case 8:
				printf("|%s  %3d  %#4x", " BS", c1, c1);
				break;
			case 9:
				printf("|%s  %3d  %#4x", " HT", c1, c1);
				break;
			case 10:
				printf("|%s  %3d  %#4x", " LF", c1, c1);
				break;
			case 11:
				printf("|%s  %3d  %#4x", " VT", c1, c1);
				break;
			case 12:
				printf("|%s  %3d  %#4x", " FF", c1, c1);
				break;
			case 13:
				printf("|%s  %3d  %#4x", " CR", c1, c1);
				break;
			case 14:
				printf("|%s  %3d  %#4x", " SQ", c1, c1);
				break;
			case 15:
				printf("|%s  %3d  %#4x", " SI", c1, c1);
				break;
			case 16:
				printf("|%s  %3d  %#x", "DLE", c1, c1);
				break;
			case 17:
				printf("|%s  %3d  %#4x", "DC1", c1, c1);
				break;
			case 18:
				printf("|%s  %3d  %#4x", "DC2", c1, c1);
				break;
			case 19:
				printf("|%s  %3d  %#4x", "DC3", c1, c1);
				break;
			case 20:
				printf("|%s  %3d  %#4x", "DC4", c1, c1);
				break;
			case 21:
				printf("|%s  %3d  %#4x", "NAK", c1, c1);
				break;
			case 22:
				printf("|%s  %3d  %#4x", "SYN", c1, c1);
				break;
			case 23:
				printf("|%s  %3d  %#4x", "ETB", c1, c1);
				break;
			case 24:
				printf("|%s  %3d  %#4x", "CAN", c1, c1);
				break;
			case 25:
				printf("|%s  %3d  %#4x", " EM", c1, c1);
				break;
			case 26:
				printf("|%s  %3d  %#4x", "SUB", c1, c1);
				break;
			case 27:
				printf("|%s  %3d  %#4x", "ESC", c1, c1);
				break;
			case 28:
				printf("|%s  %3d  %#4x", " FS", c1, c1);
				break;
			case 29:
				printf("|%s  %3d  %#4x", " GS", c1, c1);
				break;
			case 30:
				printf("|%s  %3d  %#4x", " RS", c1, c1);
				break;
			case 31:
				printf("|%s  %3d  %#4x", " US", c1, c1);
				break;
		}
		printf("|%c   %3d   %#x", c2, c2, c2);
		printf("|%c   %3d   %#x", c3, c3, c3);

		if (c4 == 127)
		{
			printf("|%s %3d   %#x|", "DEL", c4, c4);
		} else {
			printf("|%c   %3d   %#x|", c4, c4, c4);
		}
		printf("\n");
	}

	return 0;
}
Anuncios
Anuncios

Aqui parece que hicimos un monton de modificaciones pero no son tantas, la primera fue agregar una nueva columna de identificacion, despues otro bloque separador, por ultimo debemos usar un switch donde evaluaremos los posibles valores de la variable c1, el cual sera el rango de 0 a 31 y en ella usaremos un printf especifico para cada valor y en ellas indicaremos a que representa, observen que cambiamos el operador %c por %s para poder representar cadenas en lugar de caracteres, otra modificacion que tenemos es la cantidad de caracteres que representaran en la seccion hexadecimal, el resto seguira siendo lo mismo, por ultimo tenemos un condicional donde si la variable c4 tiene el valor 127 especificaremos un printf para indicar que es el de supresion (DEL) y en caso contrario mostrara el caracter correspondiente, con todo esto comentado compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ascii
|Car  Dec  Hex |Car  Dec  Hex |Car  Dec  Hex |Car  Dec  Hex |
|--------------|--------------|--------------|--------------|
|NUL    0     0|     32   0x20|@    64   0x40|`    96   0x60|
|SOH    1   0x1|!    33   0x21|A    65   0x41|a    97   0x61|
|STX    2   0x2|"    34   0x22|B    66   0x42|b    98   0x62|
|ETX    3   0x3|#    35   0x23|C    67   0x43|c    99   0x63|
|EOF    4   0x4|$    36   0x24|D    68   0x44|d   100   0x64|
|ENQ    5   0x5|%    37   0x25|E    69   0x45|e   101   0x65|
|ACK    6   0x6|&    38   0x26|F    70   0x46|f   102   0x66|
|BEL    7   0x7|'    39   0x27|G    71   0x47|g   103   0x67|
| BS    8   0x8|(    40   0x28|H    72   0x48|h   104   0x68|
| HT    9   0x9|)    41   0x29|I    73   0x49|i   105   0x69|
| LF   10   0xa|*    42   0x2a|J    74   0x4a|j   106   0x6a|
| VT   11   0xb|+    43   0x2b|K    75   0x4b|k   107   0x6b|
| FF   12   0xc|,    44   0x2c|L    76   0x4c|l   108   0x6c|
| CR   13   0xd|-    45   0x2d|M    77   0x4d|m   109   0x6d|
| SQ   14   0xe|.    46   0x2e|N    78   0x4e|n   110   0x6e|
| SI   15   0xf|/    47   0x2f|O    79   0x4f|o   111   0x6f|
|DLE   16  0x10|0    48   0x30|P    80   0x50|p   112   0x70|
|DC1   17  0x11|1    49   0x31|Q    81   0x51|q   113   0x71|
|DC2   18  0x12|2    50   0x32|R    82   0x52|r   114   0x72|
|DC3   19  0x13|3    51   0x33|S    83   0x53|s   115   0x73|
|DC4   20  0x14|4    52   0x34|T    84   0x54|t   116   0x74|
|NAK   21  0x15|5    53   0x35|U    85   0x55|u   117   0x75|
|SYN   22  0x16|6    54   0x36|V    86   0x56|v   118   0x76|
|ETB   23  0x17|7    55   0x37|W    87   0x57|w   119   0x77|
|CAN   24  0x18|8    56   0x38|X    88   0x58|x   120   0x78|
| EM   25  0x19|9    57   0x39|Y    89   0x59|y   121   0x79|
|SUB   26  0x1a|:    58   0x3a|Z    90   0x5a|z   122   0x7a|
|ESC   27  0x1b|;    59   0x3b|[    91   0x5b|{   123   0x7b|
| FS   28  0x1c|<    60   0x3c|\    92   0x5c||   124   0x7c|
| GS   29  0x1d|=    61   0x3d|]    93   0x5d|}   125   0x7d|
| RS   30  0x1e|>    62   0x3e|^    94   0x5e|~   126   0x7e|
| US   31  0x1f|?    63   0x3f|_    95   0x5f|DEL 127   0x7f|
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Ahora si oficialmente tenes toda la tabla ASCII basica para poder trabajar con nuestros codigos, si observan en la columna de caracteres de control tenemos algunos que podemos utilizarlos para interceptar teclas, les dejo un par de ejemplos:

  • 10 o 13, se pueden usar para la tecla ENTER
  • 27, para la tecla ESC
  • 9, para la tecla de TAB
  • 8, para la tecla BACKSPACE
Anuncios

Pero de esto trataremos de verlo un poco mas adelante, por el momento lo dejamos aqui y esto les puede servir como referencia para futuros codigos.

Anuncios

En resumen, hoy hemos generado nuestra propia tabla ASCII, hemos implementado mucho del conocimiento anterior desde conceptos del lenguaje hasta lo visto recientemente en caracteres, primero hemos visto como mostrar los caracteres imprimibles y por ultimo una forma basica de representacion a los caracteres de control, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50