web-dev-qa-db-fra.com

Comment exactement le code binaire est-il converti en lettres?

Par curiosité, comment le code binaire est-il converti en lettres? Je sais qu'il existe des sites qui convertissent automatiquement le binaire en mots pour vous, mais je veux comprendre les étapes intermédiaires spécifiques que traverse le code binaire avant d'être converti en lettres.

26
user701510

En supposant que par "code binaire" vous entendez simplement de vieilles données (séquences de bits ou octets), et que par "lettres" vous voulez dire des caractères, la réponse est en deux étapes. Mais d'abord, un peu de contexte.

  • Un caractère est simplement un symbole nommé, tel que "LETTRE MAJUSCULE LATINE A" ou "LETTRE MINUSCULE GRECQUE PI" ou "BLACK CHESS KNIGHT". Ne confondez pas un caractère (symbole abstrait) avec un glyph (une image d'un caractère).
  • Un jeu de caractères est un ensemble particulier de caractères, chacun associé à un numéro spécial appelé son code. Pour voir les mappages de points de code dans le jeu de caractères Unicode, voir http://www.unicode.org/Public/UNIDATA/UnicodeData.txt .

Bon maintenant voici les deux étapes:

  1. Les données, si elles sont textuelles, doivent être accompagnées d’une manière ou d’une autre par un encodage de caractères, quelque chose comme UTF-8, Latin-1, US-ASCII, etc. Chaque schéma d’encodage de caractères spécifie de manière très détaillée l’interprétation des séquences d’octets. en tant que points de code (et inversement, comment les points de code sont codés en séquences d'octets).

  2. Une fois que les séquences d'octets sont interprétées comme des points de code, vous avez vos caractères, car chaque caractère a un point de code spécifique.

Quelques notes:

  • Dans certains codages, certaines séquences d'octets ne correspondent à aucun point de code, vous pouvez donc avoir des erreurs de décodage de caractères.
  • Dans certains jeux de caractères, certains points de code sont inutilisés, c'est-à-dire qu'ils ne correspondent à aucun caractère.

En d'autres termes, chaque séquence d'octets ne signifie pas nécessairement quelque chose comme texte.

20
Ray Toal

Voici un moyen de convertir des nombres binaires en caractères ASCII assez simples à faire dans votre tête.

1 - Convertit tous les 4 chiffres binaires en un chiffre hexadécimal.

Voici un tableau de conversion binaire en hexadécimal:

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

(Les nombres hexadécimaux a à f sont les nombres décimaux 10 à 15. C'est ce que hexadécimal, ou "base 16" - au lieu que chaque chiffre puisse représenter 10 nombres différents [0 à 9], comme décimal ou "base 10" Au lieu de cela, chaque chiffre est à la place capable de représenter 16 nombres différents [0 - f].)

Une fois que vous connaissez ce graphique, convertir une chaîne de chiffres binaires en chaîne de chiffres hexadécimaux est simple.

Par exemple, 

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

Assez simple, non? Il est simple de convertir un nombre binaire de longueur quelconque en son équivalent hexadécimal.

(Cela fonctionne car hexadécimal est la base 16 et binaire est la base 2 et 16 est la 4ème puissance de 2, il faut donc 4 chiffres binaires pour obtenir 1 chiffre hexadécimal. 10, en revanche, n’est pas une puissance de 2; ne peut pas convertir binaire en décimal presque aussi facilement.)

2 - Divisez la chaîne de chiffres hexadécimaux en paires.

Lors de la conversion d'un nombre en ASCII, chaque caractère hexadécimal est un caractère. Donc, divisez la chaîne hexagonale en ensembles de 2 chiffres.

Vous sépareriez un nombre hexadécimal comme 7340298b392 en 6 paires, comme ceci:

7340298b392 = 07 34 02 98 b3 92

(Remarquez que j'ai préfixé un 0, car j'avais un nombre impair de chiffres hexadécimaux.)

C'est 6 paires de chiffres hexadécimaux, donc ça va être 6 lettres. (Sauf que je sais tout de suite que 98, b3 et 92 ne sont pas des lettres. J'expliquerai pourquoi dans une minute.)

3 - Convertissez chaque paire de chiffres hexadécimaux en un nombre décimal.

Pour ce faire, multipliez le (chiffre décimal du) chiffre gauche par 16 et ajoutez le 2e.

Par exemple, b3 hex = 11 * 16 + 3, ce qui correspond à 110 + 66 + 3, ce qui correspond à 179 . (B hex correspond à 11 décimales).

4 - Convertissez les nombres décimaux en ASCII caractères.

Maintenant, pour obtenir les ASCII lettres des nombres décimaux, gardez simplement à l’esprit que, en ASCII, 65 est une majuscule «A» et 97 une minuscule «a».

Alors, quelle lettre est 68?

68 est la 4ème lettre de l'alphabet en majuscule, non?
65 = A, 66 = B, 67 = C, 68 = D.

Donc, 68 est «D».

Vous prenez le nombre décimal, soustrayez 64 pour les lettres majuscules si le nombre est inférieur à 97, ou 96 pour les lettres minuscules si le nombre est 97 ou plus, et c'est le numéro de la lettre de l'alphabet associé à cet ensemble de 2 chiffres hexadécimaux .


Sinon, si vous n'êtes pas effrayé par un peu d'arithmétique hexa facile, vous pouvez ignorer l'étape 3 et simplement passer directement d'hex à ASCII, en vous rappelant par exemple que 

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

Donc, soustrayez 40 hex pour les lettres majuscules ou 60 hex pour les lettres minuscules et convertissez ce qui reste en décimal pour obtenir le numéro de lettre de l'alphabet.

Par exemple 

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

(En faisant cela, il est utile de se rappeler que "m" (ou "M") est la lettre de l'alphabet. Vous pouvez donc compter jusqu'à 13 pour trouver une lettre plus proche du milieu que de l'une ou l'autre de ses extrémités. )

Je l'ai déjà vu sur une chemise et je pouvais le lire dans ma tête:

01000100
01000001
01000100

Je l'ai fait comme ça:

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 chemise disait "DAD", ce qui me semblait plutôt cool, car elle était achetée par une femme enceinte. Son mari doit être un geek comme moi.


Comment ai-je su tout de suite que 92, b3 et 98 n'étaient pas des lettres? 

Parce que le code ASCII pour un 'z' minuscule est 96 + 26 = 122, qui en hexa est 7a. 7a est le plus grand nombre d'hex pour une lettre. Tout ce qui dépasse 7a n'est pas une lettre.


Donc, c'est comme ça que vous pouvez le faire en tant qu'être humain.

Comment les programmes informatiques le font-ils?

Pour chaque ensemble de 8 chiffres binaires, convertissez-le en nombre et recherchez-le dans un tableau ASCII. 

(C'est un moyen assez évident et direct. Un programmeur typique pourrait probablement penser à 10 ou 15 autres moyens en quelques minutes. Les détails dépendent de l'environnement du langage informatique.)

18
Shavais

Voulez-vous dire la conversion 011001100110111101101111foo, par exemple? Il suffit de prendre le flux binaire, de le diviser en octets distincts (01100110, 01101111, 01101111) et de rechercher le caractère ASCII correspondant au numéro indiqué. Par exemple, 01100110 est 102 en décimal et le caractère ASCII avec le code 102 est f:

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

( Voir ce que fait la fonction chr .) Vous pouvez généraliser cet algorithme avec un nombre différent de bits par caractère et des codages différents, le point reste le même.

7
zoul

Pour lire les caractères binaires ASCII à grande vitesse en utilisant uniquement votre tête:

Les lettres commencent par les premiers bits 01. Le bit 3 est activé (1) pour les minuscules et désactivé (0) pour les majuscules. Balayez les bits 4 à 8 suivants pour le premier activé et sélectionnez la lettre de départ du même index dans cette chaîne: «PHDBA» (pensez P.H.D., Bachelors in Arts). Par exemple. 1xxxx = P, 01xxx = H, etc. Convertissez ensuite les bits restants en une valeur entière (par exemple, 010 = 2) et comptez le nombre de lettres de votre lettre de départ. Par exemple. 01001010 => H + 2 = J.

0
Edward Anderson

http://www.roubaixinteractive.com/PlayGround/Binary_Conversion/The_Characters.asp il a juste l'air ici ... (pas ICI mais il a une table).

Il y a 8 bits dans un octet. Un octet peut être un symbole. Un bit est activé ou désactivé.

0
U4iK_HaZe

Pourquoi ne pas simplement faire cela, prenez 010010001001001 et divisez-le en deux bits de 8 lettres chacun (01001000, 01001001). Puis émettre les pouvoirs

01001000. 01001001. 

Les 8 premiers ignorent les trois premiers qu’ils déterminent s’il s’agit ou non de capital, le virage de droite à gauche fait des pouvoirs de 2 (2 ^ 1, 2 ^ 2 2 ^ 3 2 ^ 4 2 ^ 5). Donc, additionnez tous les éléments, il n'y en a qu'un, et il = 8, et la huit lettre de l'alphabet est h, notre premier bit est la lettre h, essayez-le sur l'autre bit

0
Hunter