¿Qué es ASCII?

ASCII (American Standard Code for Information Interchange), es un código de caracteres basado en el alfabeto latino. Fue creado en 1963 por el Comité Estadounidense de Estándares (Instituto Estadounidense de Estándares Nacionales, ANSI) como una evolución de los conjuntos de códigos utilizados entonces en telegrafía. Más tarde, en 1967, se incluyeron las minúsculas, y se redefinieron algunos códigos de control para formar el código conocido como US-ASCII.

El código ASCII utiliza 7 bits para representar los caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para detectar errores en la transmisión. A menudo se llama incorrectamente ASCII a otros códigos de caracteres de 8 bits, como el estándar ISO-8859-1 que es una extensión que utiliza 8 bits para proporcionar caracteres adicionales usados en idiomas distintos al inglés, como el español.

ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 32 caracteres no imprimibles, de los cuales la mayoría son caracteres de control obsoletos que tienen efecto sobre cómo se procesa el texto, más otros 95 caracteres imprimibles que les siguen en la numeración.

A veces es pasar ciertas cadenas de texto a formato hexadecimal y separado por algún tipo de separador como “:” o “-“. Por ejemplo para convertir las claves wifi a hexadecimal, necesario para auditoria wifi… Para ello realize este codigo en C:


#include <stdio.h>

int ascii2hex(char *ascii, char *splitter, char* prefix, int block) {
        int c = 0;
        do {
                char hex[3];
                hex[0] = (ascii / 0x10 < 10) ? (ascii / 0x10) + '0' : ((ascii / 0x10) - 10) + 'a';
                hex[1] = (ascii % 0x10 < 10) ? (ascii % 0x10) + '0' : ((ascii % 0x10) - 10) + 'a';
                hex[2] = '\0';

                if (prefix != NULL) printf("%s", prefix);
                printf("%s", (char *) hex);
                if (ascii != '\0')
                        if (splitter != NULL) printf("%s", splitter);
                c++;
                if (block != 0)
                        if (c % block == 0) printf("\n");

        } while(ascii != '\0');

        printf("\n");

        return 0;
}

int main(int argc, char *argv[]) {
        if (argc <= 1)
                printf("Usage: %s <ascii string> [splitter] [prefix] [block]\n", argv[0]);
        else
                if (argc == 2)
                        return ascii2hex(argv[1], NULL, NULL, 0);
                else if (argc == 3)
                        return ascii2hex(argv[1], argv[2], NULL, 0);
                else if (argc == 4)
                        return ascii2hex(argv[1], argv[2], argv[3], 0);
                else if (argc == 5)
                        return ascii2hex(argv[1], argv[2], argv[3], atoi(argv[4]));

        return 0;
}

Para compilarlo en Linux podemos usar el compilador GCC:

gcc ascii2hex.c -o ascii2hex

Y se usaría de la siguiente forma:

./ascii2hex “Cadena de texto” “:”

Resultado:

43:61:64:65:6e:61:20:64:65:20:74:65:78:74:6f

O por ejemplo pasa generar una matriz:

./ascii2hex “Cadena de texto” “, ” “0x”

Resultado:

0x43, 0x61, 0x64, 0x65, 0x6e, 0x61, 0x20, 0x64, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x6f

Y si queremos partir la cadena en offsets o bloques de 16 bytes seria así:

./ascii2hex “Cadena de texto partida en bloques” “, ” “0x” 16

Resultado:

0x43, 0x61, 0x64, 0x65, 0x6e, 0x61, 0x20, 0x64, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x6f, 0x20,
0x70, 0x61, 0x72, 0x74, 0x69, 0x64, 0x61, 0x20, 0x65, 0x6e, 0x20, 0x62, 0x6c, 0x6f, 0x71, 0x75,
0x65, 0x73