2011-07-26 12 views
19

Por curiosidad, ¿cómo se convierte exactamente el código binario en letras? Sé que hay sitios que automáticamente convierten el binario en palabras para ti, pero quiero comprender los pasos intermedios específicos por los que pasa el código binario antes de convertirlos en letras.¿Cómo se convierte exactamente el código binario en letras?

+0

¿Qué quiere decir con código binario? ¿Quiere decir de un código ASCII a la letra correspondiente? – Giorgio

Respuesta

17

Suponiendo que por "código binario" quiere decir simplemente datos antiguos (secuencias de bits o bytes), y que por "letras" se entiende caracteres, la respuesta es en dos pasos. Pero primero, algunos antecedentes.

  • Un carácter es sólo un símbolo denominado como "Letra latina mayúscula A" o "PI LETRA GRIEGA" o "NEGRO Caballero del ajedrez". No confundas un personaje (símbolo abstracto) con un glifo (una imagen de un personaje).
  • A conjunto de caracteres es un conjunto particular de caracteres, cada uno de los cuales está asociado a un número especial, llamado punto de código. Para ver las asignaciones de puntos de código en el conjunto de caracteres Unicode, consulte http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Bueno, ahora aquí son los dos pasos:

  1. Los datos, si es textual, debe ir acompañada de alguna forma por una codificación carácter, algo así como UTF-8, Latin-1, US-ASCII, etc. Cada esquema de codificación de caracteres especifica en gran detalle cómo las secuencias de bytes se interpretan como puntos de código (y, a la inversa, cómo se codifican los puntos de código como secuencias de bytes).

  2. Una vez que las secuencias de bytes se interpretan como puntos de código, tiene sus caracteres, porque cada carácter tiene un punto de código específico.

Un par de notas:

  • En algunas codificaciones, ciertas secuencias de bytes que no correspondan a los puntos de código en absoluto, lo que puede tener errores de decodificación de caracteres.
  • En algunos conjuntos de caracteres, hay puntos de código que no se utilizan, es decir, no corresponden a ningún carácter.

En otras palabras, no todas las secuencias de bytes significan algo como texto.

+0

Respuesta muy esclarecedora. Contiene conocimiento importante, que se usará bien. –

7

¿Se refiere a la conversión 011001100110111101101111foo, por ejemplo? Simplemente tome la secuencia binaria, divídala en bytes separados (01100110, 01101111, 01101111) y busque el carácter ASCII que corresponde al número dado. Por ejemplo, 01100110 es 102 en decimal y el carácter ASCII con el código 102 es f:

$ perl -E 'say 0b01100110' 
102 
$ perl -E 'say chr(102)' 
f 

(See what the chr function does.) Se puede generalizar este algoritmo y tienen un número diferente de bits por carácter y diferentes codificaciones, los restos de punto lo mismo.

0

¿Por qué no hacer esto? Tomar 010010001001001 dividirlo en dos bits de 8 letras cada uno (01001000, 01001001). A continuación, emita los poderes

01001000. 01001001.

Los primeros 8 ignoran los tres primeros determinan si es o no el capital, el ir a la derecha a la izquierda poderes que hacen de 2 (2^1, 2^2^2 3 2^4 2^5). Entonces, sume todos, solo hay uno, e = 8, y la letra ocho en el alfabeto es h, entonces nuestro primer bit es la letra h, pruébelo en el otro bit

16

He aquí una forma de convertir números binarios para caracteres ASCII que a menudo son lo suficientemente simples como para hacer en tu cabeza.

1 - Convierte cada 4 dígitos binarios en un dígito hexadecimal.

Aquí hay una binario a tabla de conversión hex:

0001 = 1 
0010 = 2 
0011 = 3 
0100 = 4 
0101 = 5 
0110 = 6 
0111 = 7 
1000 = 8 

1001 = 9 
1010 = a (the hex number a, not the letter a) 
1011 = b 
1100 = c 
1101 = d 
1110 = e 
1111 = f 

(Los números hexadecimales A a F son los números decimales 10 a 15. Eso es lo hexadecimal, o "base 16" es - en lugar de cada dígito siendo capaz de representar 10 números diferentes [0 - 9], como decimales o "base 10", cada dígito es capaz de representar 16 números diferentes [0 - f].)

Una vez que sepa esa tabla, convirtiendo cualquier cadena de dígitos binarios en una cadena de dígitos hexadecimales es simple.

Por ejemplo,

01000100 = 0100 0100 = 44 hex 
1010001001110011 = 1010 0010 0111 0011 = a273 hex 

Bastante simple, ¿verdad? Es una simple cuestión convertir un número binario de cualquier longitud en su equivalente hexadecimal.

(Esto funciona porque hexadecimal es la base 16 y el binario es la base 2 y 16 es la 4ª potencia de 2, por lo que toma 4 dígitos binarios para hacer 1 dígito hexadecimal.10, por otro lado, no es un poder de 2, así que no podemos convertir binario a decimal casi tan fácilmente.)

2 - Divida la cadena de dígitos hexadecimales en pares.

Al convertir un número en ASCII, cada 2 dígitos hexadecimales es un carácter. Así que divide la cadena hexagonal en conjuntos de 2 dígitos.

Se podría dividir un número hexadecimal como 7340298b392 esto en 6 pares, como este:

7340298b392 = 07 34 02 98 b3 92 

(Note que antepone un 0, ya que tenía un número impar de dígitos hexadecimales.)

Eso es 6 pares de dígitos hexadecimales, por lo que serán 6 letras. (Excepto que sé de inmediato que 98, B3 y 92 no son letras. Explicaré por qué en un minuto.)

3 - Convierta cada par de dígitos hexadecimales en un número decimal.

Haga esto multiplicando el (decimal equivalente al) dígito izquierdo por 16 y agregando el 2do.

Por ejemplo, b3 hex = 11 * 16 + 3, que es 110 + 66 + 3, que es 179. (b hex es 11 decimal.)

4 - Convierta los números decimales en caracteres ASCII.

Ahora, para obtener las letras ASCII para los números decimales, simplemente tenga en cuenta que en ASCII, 65 es una 'A' en mayúscula, y 97 es una 'a' en minúscula.

Entonces, ¿qué letra es 68?

68 es la cuarta letra del alfabeto en mayúsculas, ¿verdad?
65 = A, 66 = B, 67 = C, 68 = D.

Entonces 68 es 'D'.

Toma el número decimal, resta 64 para letras mayúsculas si el número es menor que 97, o 96 para letras minúsculas si el número es 97 o mayor, y ese es el número de la letra del alfabeto asociado con ese conjunto de 2 dígitos hexadecimales


Alternativamente, si usted no tiene miedo de un poco de aritmética fácil hexagonal, puede omitir el paso 3, y sólo tiene que ir directamente de hexadecimal a ASCII, recordando, por ejemplo, que

hex 41 = 'A' 
hex 61 = 'a' 

Reste 40 hex para letras mayúsculas o 60 hex para letras minúsculas, y convierta lo que queda a decimal para obtener el número de letra del alfabeto.

Por ejemplo

01101100 = 6c, 6c - 60 = c = 12 decimal = 'l' 
01010010 = 52, 52 - 40 = 12 hex = 18 decimal = 'R' 

(Al hacer esto, es útil recordar que 'm' (o 'M') es el 13 letra del alfabeto. Así que usted puede contar hacia arriba o hacia abajo del 13 al . encontrar una carta que está más cerca del centro que a cualquiera de los extremos)

vi esto en una camisa una vez, y fue capaz de leerlo en mi cabeza:

01000100 
01000001 
01000100 

lo hice así:

01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 
01000001 = 0100 0001 = 41 hex, - 40 hex = ucase letter 1 = A 
01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 

La camisa decía "PAPÁ", que pensé que era genial, ya que estaba siendo comprada por una mujer embarazada. Su esposo debe ser un geek como yo.


¿Cómo sabía de inmediato que 92, b3 y 98 no eran letras?

Porque el código ASCII para una 'z' minúscula es 96 + 26 = 122, que en hex es 7a. 7a es el número hexadecimal más grande para una letra. Cualquier cosa más grande que 7a no es una letra.


Así es como puede hacerlo como ser humano.

¿Cómo lo hacen los programas de computadora?

Para cada conjunto de 8 dígitos binarios, conviértalo en un número y búsquelo en una tabla ASCII.

(Esa es una manera bastante obvia y directa. Un programador típico probablemente podría pensar en 10 o 15 formas más en el lapso de algunos minutos. Los detalles dependen del entorno de lenguaje de la computadora.)

+0

gracias. Me resulta más fácil leer sin los dígitos hexadecimales, también ver el byte '01000100' como' 2^6 + 2^2' = 68 directamente. – Blauhirn

+0

Interesante. Veamos, supongo que el dígito que está más a la derecha es 2^0, entonces 2^6 es el séptimo dígito del más a la derecha. 2^6 es ... 2,4,8,16,32,64 .. y 2^2 es 2 * 2 que es 4, entonces, correcto, eso sería 68. Los códigos Ascii tienen 8 bits de ancho, entonces adivina si conoces los poderes de 2 a 7 bits (ya que 01111010 es la letra más grande), ese método podría ser lo suficientemente práctico, aunque algo como 01011010 podría tomar más tiempo de esa manera que si solo conoces los dígitos hexadecimales a 4 bits; 0101 = 5, 1010 = A, entonces 5A. Convirtiendo a una letra: 0x5A - 0x40 (letras mayúsculas) = ​​0x1A = 16 + 10 = 26 (en letras mayúsculas) = ​​'Z'. – Shavais

+0

Si realmente prefiere trabajar en decimal, creo que en realidad puede conocer los valores decimales en 4 bits, y para cada conjunto de 8 bits, multiplique el conjunto de la izquierda por 16 y agregue el 2 ° conjunto. Entonces 0101: 1010 = 5:10 = 5 * 16 + 10 = 50 + 30 + 10 = 90. Si sabes que 64 es el número decimal que restas para las letras mayúsculas, obtienes 26 ('Z') de esa manera. – Shavais

Cuestiones relacionadas