Le recodage des caractères est généralement effectué lorsque le système récepteur ne peut pas les traiter. Par exemple, BASE64 représente des données en utilisant 6 bits (2 6 , donc 64) de caractères pour représenter des séquences de données plus longues (le "==" parfois apparaissant à la fin est un remplissage pour l'alignement). En effet, votre fichier image dans le courrier électronique peut contenir 0xFE et votre serveur de messagerie sera malheureux de le transmettre (ou tout autre caractère traditionnellement non imprimable).
Il n'y a pas d'encodage qui "réduit la taille". Les encodages ne sont que des mappages de bits au caractère qu'ils représentent. Cela dit, ASCII est un jeu de caractères (codage) de 7 bits qui est souvent stocké dans 8 bits d'espace. Si vous limitez les plages que vous acceptez, vous pouvez également éliminer les caractères de contrôle.
L'utilisation de cette méthode signifie que vous devez écrire des choses au niveau des bits, et cela joue aussi un peu l'enfer avec la vitesse et les instructions de la machine car toutes les machines modernes ont des alignements qui sont des multiples de 8 bits. C'est, par exemple, pourquoi Unicode est UTF-8, UTF-16 et UTF-32.
Si vous faites cela pour la sécurité (c'est pourquoi vous l'avez posté sur Security.SE, non?), Il suffit de filtrer les choses et de les stocker normalement. Si vous faites cela pour économiser de l'espace, demandez-vous si tout le code supplémentaire et le temps d'accès plus lent (car la plupart des entrées dépasseront les limites des adresses) valent les économies d'espace.
D'ailleurs, ce qui suit est un extrait d'un cours CS où nous avons dû convertir ASCII du stockage 8 bits en 7 bits:
memset(dest,0x00,8);
memcpy(dest, source, length);
for (int i = 0; i < 8; i++) {
if (dest[i] & 0x80) {
fprintf(stderr, "%s: %s\n", dest, "Illegal byte sequence");
exit(EILSEQ);
}
}
dest[0] = 0x7F & dest[0] | 0x80 & dest[1] << 7;
dest[1] = 0x3F & dest[1] >> 1 | 0xC0 & dest[2] << 6;
dest[2] = 0x1F & dest[2] >> 2 | 0xE0 & dest[3] << 5;
dest[3] = 0x0F & dest[3] >> 3 | 0xF0 & dest[4] << 4;
dest[4] = 0x07 & dest[4] >> 4 | 0xF8 & dest[5] << 3;
dest[5] = 0x03 & dest[5] >> 5 | 0xFC & dest[6] << 2;
dest[6] = 0x01 & dest[6] >> 6 | 0xFE & dest[7] << 1;
dest[7] = 0x00; //Clearing out