Codage et décodage Basetop 10 avec C ++

Codage et décodage Basetop 10 avec C ++
Base64 est un jeu de caractères de 64 caractères, où chaque personnage se compose de 6 bits. Tous ces 64 caractères sont des caractères imprimables. Un personnage est un symbole. Ainsi, chaque symbole du jeu de caractères de la base 64 est composé de 6 bits. Ces six bits sont appelés un sextet. Un octet ou un octet se compose de 8 bits. Le jeu de caractères ASCII se compose de 127 caractères, dont certains ne sont pas imprimables. Ainsi, certains caractères du jeu de caractères ASCII ne sont pas des symboles. Un symbole pour le jeu de caractères ASCII est composé de 8 bits.

Les données de l'ordinateur sont stockées en octets de 8 bits chacun. Les données sont envoyées de l'ordinateur en octets de 8 bits chacun. Les données sont reçues dans l'ordinateur en octets de 8 bits chacun.

Un flux d'octets peut être converti en un flux de sextets (6 bits par symbole). Et c'est le codage de base64. Un flux de sextets peut être converti en un flux d'octets. Et c'est le décodage de base64. En d'autres termes, un flux de caractères ASCII peut être converti en un flux de symboles sexuels. C'est un codage, et l'inverse est le décodage. Le flux de symboles sexuels, converti à partir d'un flux de symboles d'octet (octet), est plus long que le flux de symboles d'octet par numéro. En d'autres termes, un flux de caractères Base64 est plus long que le flux correspondant de caractères ASCII. Eh bien, le codage dans la base64 et le décodage à partir de celui-ci n'est pas aussi simple que juste exprimé.

Cet article explique le codage et le décodage de Base64 avec le langage informatique C ++. La première partie de l'article explique correctement le codage et le décodage de base64. La deuxième partie montre comment certaines fonctionnalités C ++ peuvent être utilisées pour coder et décoder la base64. Dans cet article, le mot «octet» et «octet» sont utilisés de manière interchangeable.

Contenu de l'article

  • Se déplaçant jusqu'à la base 64
  • Encoding Base64
  • Nouvelle longueur
  • Décodage Base64
  • Erreur de transmission
  • Fonctionnalités de bits C ++
  • Conclusion

Se déplaçant jusqu'à la base 64

Un alphabet ou un jeu de caractères de 2 symboles peut être représenté avec un bit par symbole. Laissez les symboles de l'alphabet se composent: zéro et un. Dans ce cas, zéro est bit 0, et l'un est le bit 1.

Un alphabet ou un jeu de caractères de 4 symboles peut être représenté avec deux bits par symbole. Laissez les symboles de l'alphabet se composent: 0, 1, 2, 3. Dans cette situation, 0 est 00, 1 est 01, 2 est 10 et 3 est 11.

Un alphabet de 8 symboles peut être représenté avec trois bits par symbole. Laissez les symboles de l'alphabet se composent: 0, 1, 2, 3, 4, 5, 6, 7. Dans cette situation, 0 est 000, 1 est 001, 2 IS 010, 3 IS 011, 4 est 100, 5 est 101, 6 est 110 et 7 est 111.

Un alphabet de 16 symboles peut être représenté avec quatre bits par symbole. Laissez les symboles de l'alphabet se composent: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Dans cette situation, 0 est 0000, 1 est 0001, 2 IS 0010, 3 IS 0011, 4 IS 0100, 5 IS 0101, 6 IS 0110, 7 IS 0111, 8 IS 1000, 9 IS 1001, A IS 1010, B EST 1011, C est 1100, D est 1101, E est 1110 et F est 1111.

Un alphabet de 32 symboles différents peut être représenté avec cinq bits par symbole.

Cela nous amène à un alphabet de 64 symboles différents. Un alphabet de 64 symboles différents peut être représenté avec six bits par symbole. Il y a un jeu de caractères particulier de 64 symboles différents, appelé Base64. Dans cet ensemble, les 26 premiers symboles sont les 26 lettres majuscules de la langue parlée anglaise, dans son ordre. Ces 26 symboles sont les premiers nombres binaires de 0 à 25, où chaque symbole est un sextet, six bits. Les numéros binaires suivants de 26 à 51 sont les 26 lettres minuscules de la langue parlée anglaise, dans son ordre; Encore une fois, chaque symbole, un sextet. Les nombres binaires suivants de 52 à 61 sont les 10 chiffres arabes, dans leur ordre; Pourtant, chaque symbole, un sextet.

Le numéro binaire pour 62 est pour le symbole +, et le numéro binaire pour 63 est pour le symbole / . Base64 a des variantes différentes. Ainsi, certaines variantes ont des symboles différents pour les nombres binaires de 62 et 63.

Le tableau Base64, montrant des correspondances pour l'index, le numéro binaire et le caractère, est:

L'alphabet Base64

Indice Binaire Carboniser Indice Binaire Carboniser Indice Binaire Carboniser Indice Binaire Carboniser
0 000000 UN 16 010000 Q 32 100000 g 48 110000 w
1 000001 B 17 010001 R 33 100001 H 49 110001 X
2 000010 C 18 010010 S 34 100010 je 50 110010 y
3 000011 D 19 010011 T 35 100011 J 51 110011 z
4 000100 E 20 010100 U 36 100100 k 52 110100 0
5 000101 F 21 010101 V 37 100101 l 53 110101 1
6 000110 g 22 010110 W 38 100110 m 54 110110 2
7 000111 H 23 010111 X 39 100111 n 55 110111 3
8 001000 je 24 011000 Y 40 101000 o 56 111000 4
9 001001 J 25 011001 Z 41 101001 p 57 111001 5
dix 001010 K 26 011010 un 42 101010 q 58 111010 6
11 001011 L 27 011011 b 43 101011 r 59 111011 7
12 001100 M 28 011100 c 44 101100 s 60 111100 8
13 001101 N 29 011101 d 45 101101 t 61 111101 9
14 001110 O 30 011110 e 46 101110 u 62 111110 +
15 001111 P 31 011111 F 47 101111 V 63 111111 / /

Rembourrage =

Il y a en fait 65 symboles. Le dernier symbole est =, dont le numéro binaire se compose toujours de 6 bits, qui est 111101. Il ne fait pas partie avec le symbole de base64 de 9 - voir ci-dessous.

Encoding Base64
Champs binaires sexuels

Considérez le mot:

chien

Il y a trois octets ASCII pour ce mot, qui sont:

01100100 01101111 01100111

joint. Ce sont des 3 octets mais se compose de 4 sexuels comme suit:

011001 000110 111101 100111

Depuis la table d'alphabet Base64 ci-dessus, ces 4 sextets sont les symboles,

Zg9n

Notez que le codage du «chien» dans la base64 est «zg9n», qui n'est pas compréhensible.

Base64 code une séquence de 3 octets (octets) dans une séquence de 4 sextets. 3 octets ou 4 sextets sont 24 bits.

Considérez maintenant le mot suivant:

il

Il y a deux octets ASCII pour ce mot, qui sont:

01101001 01110100

joint. Ce sont 2 octets mais se compose de 2 sextets et 4 bits. Un flux de caractères Base64 est composé de sextets (6 bits par caractère). Ainsi, deux bits zéro doivent être ajoutés à ces 16 bits pour avoir 3 sexts, c'est-à-dire:

011010 010111 010000

Ce n'est pas tout. La séquence de base64 est composée de 4 sextets par groupe; c'est-à-dire 24 bits par groupe. Le caractère de rembourrage = est 111101. Deux bits zéro ont déjà été ajoutés aux 16 bits pour avoir 18 bits. Ainsi, si les 6 bits de rembourrage du caractère de rembourrage sont ajoutés aux 18 bits, il y aura 24 bits selon les besoins. C'est-à-dire:

011010 010111 010000 111101

Les six derniers bits du dernier sextet sont le sextuor de rembourrage, = . Ces 24 bits sont composés de 4 sextets, dont le dernier sexueur mais un Sextet a les 4 premiers bits du symbole Base64, suivis de deux bits zéro.

Maintenant, considérez le mot de caractère suivant:

je

Il y a un octet ASCII pour ce mot, qui est:

01001001

Ceci est 1 octet mais se compose de 1 sextuor et 2 bits. Un flux de caractères Base64 est composé de sextets (6 bits par caractère). Ainsi, quatre bits zéro doivent être ajoutés à ces 8 bits pour avoir 2 sexuels, c'est-à-dire:

010010 010000

Ce n'est pas tout. La séquence de base64 est composée de 4 sextets par groupe; c'est-à-dire 24 bits par groupe. Le caractère de rembourrage = est 111101, qui fait six bits de long. Quatre bits zéro ont déjà été ajoutés aux 8 bits pour avoir 12 bits. Ce n'est pas jusqu'à quatre sextets. Ainsi, deux autres sexuels de rembourrage doivent être ajoutés pour fabriquer 4 sexuels, c'est-à-dire:

010010 010000 111101 111101

Flux de sortie de la base64

Dans le programme, une gamme de chars de l'alphabet Base64 doit être fabriquée, où l'index 0 a le caractère de 8 bits, a; L'indice 1 a le caractère de 8 bits, b; L'indice 2 a le caractère de 8 bits, C, jusqu'à ce que l'index 63 ait le caractère de 8 bits, / .

Ainsi, la sortie de la parole de trois caractères, «chien» sera «Zg9n» de quatre octets, exprimé en bits comme

01011010 01000111 00111001 01101110

où z est 01011010 de 8 bits; G est 01000111 sur 8 bits; 9 est 00111001 sur 8 bits, et n est 01101110 sur 8 bits. Cela signifie qu'à partir de trois octets de la chaîne d'origine, quatre octets sont sortis. Ces quatre octets sont des valeurs du tableau d'alphabet Base64, où chaque valeur est un octet.

La sortie du mot de deux caractères, «it» sera «axq =» de quatre octets, exprimés en bits comme

01100001 01011000 01010001 00111101

obtenu à partir du tableau. Cela signifie qu'à partir de deux octets, quatre octets sont toujours sortis.

La sortie du mot d'un caractère, «i» sera «sq ==» de quatre octets, exprimé en bits comme

01010011 01010001 00111101 00111101

Cela signifie que à partir d'un octet, quatre octets sont toujours sortis.

Un sextuor de 61 (111101) est sorti comme 9 (00111001). Un sextuor de = (111101) est sorti comme = (00111101).

Nouvelle longueur

Il y a trois situations à considérer ici pour avoir une estimation de la nouvelle durée.

  • La longueur d'origine de la chaîne est un multiple de 3, e.g., 3, 6, 9, 12, 15, etc. Dans ce cas, la nouvelle longueur sera exactement 133.33% de la longueur d'origine car trois octets se retrouvent en quatre octets.
  • La longueur d'origine de la chaîne est de deux octets de long, ou il se termine avec deux octets, après un multiple de 3. Dans ce cas, la nouvelle longueur sera supérieure à 133.33% de la longueur d'origine car une partie de cordes de deux octets se retrouve à quatre octets.
  • La longueur d'origine de la chaîne est un octet de long, ou il se termine par un octet après un multiple de 3. Dans ce cas, la nouvelle longueur sera supérieure à 133.33% de la longueur d'origine (plus au-dessus que le cas précédent), car une partie de chaîne d'un octet se retrouve en quatre octets.

Longueur maximale de ligne

Après être passé de la chaîne d'origine à travers le tableau d'alphabet Base64 et fini avec des octets d'au moins 133.33% de long, aucune chaîne de sortie ne doit avoir plus de 76 octets de long. Lorsqu'une chaîne de sortie mesure 76 caractères, un caractère Newline doit être ajouté avant que 76 autres octets ou moins de caractères soient ajoutés. Une longue chaîne de sortie a toutes les sections, composées de 76 caractères chacune, sauf la dernière, si elle ne fait pas jusqu'à 76 caractères. Le séparateur de lignes utilise est probablement le caractère Newline, '\ n'; Mais c'est censé être «\ r \ n».

Décodage Base64

Pour décoder, faire l'inverse de l'encodage. Utilisez l'algorithme suivant:

  • Si la chaîne reçue mesure plus de 76 caractères (octets), divisez la longue chaîne en un tableau de chaînes, en supprimant le séparateur de ligne, qui peut être "\ r \ n" ou '\ n' '.
  • S'il y a plus d'une ligne de 76 caractères chacun, cela signifie que toutes les lignes sauf les derniers se composent de quatre caractères chacun. Chaque groupe se traduira par trois caractères en utilisant le tableau d'alphabet Base64. Les quatre octets doivent être convertis en six sextets avant d'être convertis en trois octets.
  • La dernière ligne, ou la seule ligne que la chaîne aurait pu avoir, se compose toujours de groupes de quatre caractères. Le dernier groupe de quatre caractères peut être en un ou deux caractères. Pour savoir si le dernier groupe de quatre caractères se traduira par un personnage, vérifiez si les deux derniers octets du groupe sont chacun ASCII, =. Si le groupe se traduit par deux caractères, seul le dernier octet doit être ASCII, =. Toute séquence quadruple de caractères devant cette dernière séquence quadruple est gérée comme à l'étape précédente.

Erreur de transmission

À l'extrémité de réception, tout caractère autre que celui du caractère de séparation de ligne ou des caractères qui n'est pas une valeur du tableau d'alphabet Base64 indique une erreur de transmission; et devrait être manipulé. La gestion des erreurs de transmission n'est pas abordée dans cet article. Remarque: la présence de l'octet, = parmi les 76 caractères, n'est pas une erreur de transmission.

Fonctionnalités de bits C ++

Les membres fondamentaux de l'élément struct peuvent recevoir un certain nombre de bits autres que 8. Le programme suivant illustre ceci:

#inclure
Utilisation de Namespace Std;
struct s3
Unsigned Int A: 6;
Int b: 6 non signé;
non signé Int C: 6;
Int d: 6 non signé;
S3;
int main()

S3.a = 25;
S3.b = 6;
S3.c = 61;
S3.d = 39;
couter<retour 0;

La sortie est:

25, 6, 61, 39

Les entiers de sortie sont comme affectés. Cependant, chacun occupe 6 bits dans la mémoire et non 8 ou 32 bits. Notez comment le nombre de bits est attribué, dans la déclaration, avec le côlon.

Extraction des 6 premiers bits d'Octet

C ++ n'a pas de fonction ou d'opérateur pour extraire le premier ensemble de bits d'un octet. Pour extraire les 6 premiers bits, le contenu de l'octet à droite par 2 places. Les deux bits libérés à l'extrémité gauche sont remplis de zéros. L'octet résultant, qui devrait être un char non signé, est maintenant un entier, représenté par les 6 premiers bits de l'octet. Puis attribuez l'octet résultant à un élément de champ bits de structure de 6 bits. L'opérateur de shift droit est >>, à ne pas confondre avec l'opérateur d'extraction de l'objet COUT.

En supposant que le membre Struct 6 bits est, S3.A, alors les 6 premiers bits du personnage «D» sont extraits comme suit:

Char non signé CH1 = 'D';
ch1 = ch1 >> 2;
S3.a = ch1;

La valeur de S3.A peut désormais être utilisé pour indexer le tableau d'alphabet Base64.

Produisant le deuxième sextet à partir de 3 caractères

Les six secondes bits sont composées des deux derniers bits du premier octet et des 4 bits suivants du deuxième octet. L'idée est de mettre les deux derniers bits dans les cinquième et sixième positions de son octet et de rendre le reste des bits de l'octet zéro; puis bit-sage et avec les quatre premiers bits du deuxième octet qui a été à droite à sa fin.

Décalant à gauche les deux derniers bits aux cinquième et sixième positions est effectué par l'opérateur de shift gauche-bit, <<, which is not to be confused with the cout insertion operator. The following code segment left-shifts the last two bits of 'd' to the fifth and sixth positions:

Char non signé i = 'd';
i = i <<4;

À ce stade, les bits vacants ont été remplis de zéros, tandis que les bits décalés non vacés qui ne sont pas nécessaires sont toujours là. Pour faire le reste des bits dans I Zero, je dois être bit et avec 00110000, qui est l'entier, 96. La déclaration suivante le fait:

i = i & 96;

Le segment de code suivant, déplace les quatre premiers bits du deuxième octet vers les quatre dernières positions:

Char non signé J = 'O';
J = J >> 4;

Les bits vacants ont été remplis de zéros. À ce stade, j'ai 8 bits et J a 8 bits. Tous les 1 dans ces deux caractères non signés sont maintenant dans leurs bonnes positions. Pour obtenir le char, pour le deuxième sextet, ces deux caractères à 8 bits doivent être bit et, comme suit:

Char non signé CH2 = I & J;

CH2 a encore 8 bits. Pour en faire six bits, il doit être attribué à un membre du champ de masse de structure de 6 bits. Si l'élément de champ de bit struct est S3.B, alors l'affectation sera effectuée comme suit:

S3.b = ch2;

Désormais, S3.B sera utilisé à la place de CH2 pour indexer le tableau d'alphabet Base64.

Ajout de deux zéros pour le troisième sextet

Lorsque la séquence à coder a deux caractères, le troisième sextuor doit être ajouté deux zéros. Supposons qu'un octet est déjà préfixé par deux bits zéro, et les quatre bits suivants sont les bons bits. Afin de fabriquer les deux derniers bits de cet octet, deux zéros, bit-sage et l'octet avec 11111100, qui est l'entier, 252. La déclaration suivante le fait:

Char non signé CH3 = octet et 252;

CH3 a maintenant les six derniers bits, qui sont les bits requis, bien qu'il se compose toujours de 8 bits. Pour en faire six bits, il doit être attribué à un membre du champ de masse de structure de 6 bits. Si l'élément de champ de bit struct est S3.c, alors l'affectation sera effectuée comme suit:

S3.C = CH3;

Désormais, S3.C sera utilisé à la place de CH2 pour indexer le tableau d'alphabet Base64.

Le reste de la manipulation des bits peut être fait comme expliqué dans cette section.

Tableau d'alphabet Base64

Pour l'encodage, le tableau devrait être quelque chose comme,

Unsigned char arr [] = 'a', 'b', 'c', - - - '/';

Le décodage est le processus inverse. Ainsi, une carte non ordonnée doit être utilisée pour cette structure, quelque chose comme,

non ordonné_map umap = 'a', 0, 'b', 1, 'c', 2, - - - '/', 63;

La classe String

La classe String doit être utilisée pour les séquences totales non codées et codées. Le reste de la programmation est une programmation C ++ normale.

Conclusion

Base64 est un jeu de caractères de 64 caractères, où chaque personnage se compose de 6 bits. Pour l'encodage, chaque trois octets de la chaîne d'origine est converti en quatre sextets de 6 bits chacun. Ces sextets sont utilisés comme index pour la table d'alphabet Base64 pour le codage. Si la séquence se compose de deux caractères, quatre sextets sont toujours obtenus, avec le dernier sextet, étant le numéro 61. Si la séquence se compose d'un personnage, quatre sextets sont toujours obtenus, avec les deux derniers sextets, étant deux du nombre 61.

Le décodage fait l'inverse.