Sobre la representacion ascci y binaria, que es?

Iniciar i/o

Representacion y significado:

En un dispositivo de computo todo se almacena en forma de bits, asi empiezan casi todas las introducciones que hablan sobre recursos informaticos.

Algunos estudiantes y personas relacionas a los sistemas informaticos no persiven con claridad cual es la diferencia entre un numero en representacion ascci, su valor binario o hexadecimal y la forma de representarlos.

Un sistema de computo unicamente almacena informacion en formato binario, es decir todo es guardado y manipulado por medio de montones de secuencias de bits, sin embargo estos pueden represetar cualquier cosa ( o casi? ) dependiendo de los medios de los cuales se disponga para manipular e interpretarlos. Un ejemplo de esto es como se representan los caracteres que escribes por medio del teclado.

Lo caracteres ascci simplemente es un conjunto de "numeros magicos" es decir fueron tomados arbitrariamente por algun comite ( llamece ANSI ), estos numeros pudieron haber sido cualquiera, sin embargo se escojieron los mas cortos, es decir numeros enumados desde cero, de la siguiente forma:

Aqui esta la tabla ( los 128 caracteres ascii )

     $./print_ascci 

 |  |  |  |  |  |  | 
         | 
 | 
    | 
 |  \u2260  | 
 |  |  |  |  |  |  | 
 |  |  |  |  |  |  | 
! | " | # | $ | % | & | ' | 
) | * | + | , | - | . | / | 
1 | 2 | 3 | 4 | 5 | 6 | 7 | 
9 | : | ; | < | = | > | ? | 
A | B | C | D | E | F | G | 
I | J | K | L | M | N | O | 
Q | R | S | T | U | V | W | 
Y | Z | [ | \ | ] | ^ | _ | 
a | b | c | d | e | f | g | 
i | j | k | l | m | n | o | 
q | r | s | t | u | v | w | 
y | z | { | | | } | ~ |  | 

$ cat ascci.c 
#include 

int  main(void)
{
        unsigned char i=0;

        for( i=0   ;i <=128 ; i++ ){
                if( i%8 )
                printf("%c | ", i );
                else
                printf("\n");
        }

        return 0;
}


Los caracteres ascci ( pronunciado asqui ) normalmente son representados por medio de un byte, en lenguaje c, existen varios tios de datos los cuales tienen distintos tama~nos, el tipo char, usado aqui como "unsigned char i=0" nos indica que pueden ser usados tanto para representar numeros como caracteres, esto debido a que en realidad son intercambiables, pudiendo ser usados de distinta manera dependiendo del contexto en que lo usemos.

Algunos diferencian entre archivos "binarios" y archivos "ascci" o de texto, en realidad no existe una verdadera diferencia entre unos y otros excepto la forma en que accesamos a la informacion en el archivo, aqui un ejemplo:


-----------Accesaremos al archivo por medio de cat, este "trata" los archivos como de texto, mostrando cada byte por su caracter ascci
$echo "hola mundo ascci" > hola.txt
$cat hola.txt
hola mundo ascci
$
-----------Accesaremos al archivo por medio de un editor hexadecimal, este trata todos los archivos como binarios
-----------mostrando los valores de cada byte, curiosamente lo tiene que hacer por medio de numeros en ascci :)
$ hexdump hola.txt   
                                              _________ |informacion en hexadecimal: cada 2 numeros forman 1 byte
desplazamiento en hex                        /          |esto debido a que un numero hexadecimal en binario es
|     |                                                 |representado por 4 bits: 
0000000 6f68 616c 6d20 6e75 6f64 6120 6373 6963         |6:0110 9:1001 6:0110 3:0011
0000010 000a                                   
0000011
$
---------Aqui una demostracion mas precisa, en este momento estoy usando un equipo con unicode, una tabla de representacion de 
--------de caracteres como ascci pero mas grande, debido a que utiliza 2 bytes para cada caracter.x
 od -c  hola.txt 
0000000   h   o   l   a       m   u   n   d   o       a   s   c   c   i
0000020  \n        ----este caracter es el salto de linea, como vemos arriba, tiene el valor 0a( ascci) (000a en unicode)
0000021            ----en msdos y windows tiene otro componente el valor 13, en hexadecimal 0d 
ccobalto@cobalto:~/web$ od -x hola.txt
0000000 6f68 616c 6d20 6e75 6f64 6120 6373 6963
0000020 000a
0000021


Bien, ahora veremos un ejemplo de archivo binario, le sacaremos el MBR ( master boot record ) al disco duro primerio en mi laptop, este esta representado ( ven como se usa mucho ) por medio de archivo: /dev/hda, el MBR es la zona donde recide la tabla de particiones y el sector de boteo, es decir aqui s encuetran datos y codigo binario ejecutable, algo muy interesante.


--Con permisos de root:

# dd if=/dev/hda bs=1 count=512 of=mbr.bin    /* Sacamos los primeros 512 bytes del disco */
512+0 records in
512+0 records out
-------------Podemos hacer un cat y tratar el archivo como de texto: ( no significa que sera bonito)
$ cat mbr.bin
\ufffdH\ufffd\ufffd\ufffd|\ufffdPP\ufffd\ufffd|\ufffdPW\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd8n|
        u\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdIt8,t\ufffd\ufffd\ufffd\ufffd\ufffd \ufffd
\ufffd\ufffd\ufffd\ufffd\ufffdu\ufffd\ufffd\ufffdY|1\ufffd\uff98\uff90\ufffd \ufffd\ufffd@|<\ufffdt\ufffd\ufffdR
\ufffd}\ufffd4\ufffd\ufffd\ufffdtT\ufffdA\ufffd\ufffdU\ufffdZRrI\ufffd\ufffdU\ufffduC\ufffdA|\ufffd\ufffdu
\ufffd\ufffdt7f\ufffdL\ufffd|\ufffdD\ufffdf\ufffdD|\ufffd\ufffdDf\ufffd\ufffdDpf1\ufffd\ufffdDf\ufffdD
                                                     \ufffdB\ufffdr\ufffdp\ufffd}\ufffds
\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd|\ufffdD\ufffdf1\ufffd\ufffd\ufffd@f\ufffdD1\ufffd\ufffd
\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd@\ufffd1\ufffd\ufffd\ufffd\ufffd\ufffdf\ufffdf\ufffdD|f1\ufffdf\ufffd4\ufffdT
f1\ufffdf\ufffdt\ufffdT
         \ufffdD
\ufffd\ufffd\ufffdL      ;}<\ufffdT
\ufffd\ufffd\ufffdl
    Z\ufffdt
       \ufffdp\uff831\ufffd\ufffd\ufffdr*\ufffd\ufffdH|`\ufffd\uff9b1\ufffd1\ufffd\ufffd\ufffd\ufffda\ufffd&B|\ufffd
\ufffd}\ufffd@\ufffd¾£è8 ë¾£è0 ¾£è* ëþGRUB  G\u240a\u23ba\u2514 H\u2592\u23bc\u240d D\u240b\u23bd\u2510 R\u240a\u2592\u240d  E\
u23bc\u23bc\u23ba\u23bc » ´Í¬< \u2524ôà  ööáµ Ñ¿?   ?£  ÒYÿÿ·£ \u2424Z\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd
\ufffd\ufffd\ufffdx\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd%.-\ufffdU\ufffdc

-------------Podemos tratarlo por medio de un editor hexadecimal o herramientas que (esto es importante) "interpreten"
-------------de forma adecuada cada byte en el archivo
$ hexdump mbr.bin
0000000 48eb d090 00bc fb7c 0750 1f50 befc 7c1b
0000010 1bbf 5006 b957 01e5 a4f3 bdcb 07be 04b1
0000020 6e38 7c00 7509 8313 10c5 f4e2 18cd f58b
0000030 c683 4910 1974 2c38 f674 b5a0 b407 0203
0000040 00ff 2000 0001 0000 0200 90fa f690 80c2
0000050 0275 80b2 59ea 007c 3100 8ec0 8ed8 bcd0
0000060 2000 a0fb 7c40 ff3c 0274 c288 be52 7d7f
0000070 34e8 f601 80c2 5474 41b4 aabb cd55 5a13
0000080 7252 8149 55fb 75aa a043 7c41 c084 0575
0000090 e183 7401 6637 4c8b be10 7c05 44c6 01ff
00000a0 8b66 441e c77c 1004 c700 0244 0001 8966
00000b0 085c 44c7 0006 6670 c031 4489 6604 4489
00000c0 b40c cd42 7213 bb05 7000 7deb 08b4 13cd
00000d0 0a73 c2f6 0f80 ea84 e900 008d 05be c67c
00000e0 ff44 6600 c031 f088 6640 4489 3104 88d2
00000f0 c1ca 02e2 e888 f488 8940 0844 c031 d088
0000100 e8c0 6602 0489 a166 7c44 3166 66d2 34f7
0000110 5488 660a d231 f766 0474 5488 890b 0c44
0000120 443b 7d08 8a3c 0d54 e2c0 8a06 0a4c c1fe
0000130 d108 6c8a 5a0c 748a bb0b 7000 c38e db31
0000140 01b8 cd02 7213 8c2a 8ec3 4806 607c b91e
0000150 0100 db8e f631 ff31 f3fc 1fa5 ff61 4226
0000160 be7c 7d85 40e8 eb00 be0e 7d8a 38e8 eb00
0000170 be06 7d94 30e8 be00 7d99 2ae8 eb00 47fe
0000180 5552 2042 4700 6f65 006d 6148 6472 4420
0000190 7369 006b 6552 6461 2000 7245 6f72 0072
00001a0 01bb b400 cd0e ac10 003c f475 00c3 0000
00001b0 0000 0000 0000 0000 04f6 04f6 b5e1 0180
00001c0 0001 d107 1dbf 003f 0000 043f 007d d200
00001d0 1d81 5905 ffff 047e 007d 8668 020f 5a00
00001e0 ffc1 1d83 ffff 8ae6 028c 9aec 0078 1e00
00001f0 ffc1 ef07 ffff 25d2 0305 2d2e 01a3 aa55  <---esta marca significa que la primera particion es booteable
0000200

$strings mbr.bin           /*strings imprime cada posible string o cadena ascci/unicode imprimible  del archivo */
ZRrI
D|f1
GRUB   <--uso grub ven :O
Geom
Hard Disk
Read
 Error



Bien, aunque tal vez he dejado algunos temas sueltos como el unicode, espero esto pueda hacer notar las diferencias entre representacion ascci y binaria, asi como la importancia del contexto a la hora de "interpretar" el significado de cada byte, ya que esto es por mucho uno de los temas fundamentales para comprender como funcionan las cosas.

Saludos!