La codificación de caracteres generalmente se realiza cuando el sistema receptor no puede procesarlos. Por ejemplo, BASE64 representa datos usando 6 bits (2 6 , por lo tanto 64) de caracteres para representar secuencias de datos más largas (el "==" que aparece a veces al final es un relleno para la alineación). Esto se debe a que su archivo de imagen en el correo electrónico puede tener 0xFE y su servidor de correo no estará contento de transmitir eso (o cualquier otro carácter tradicionalmente no impreso).
No hay codificación que "reduzca el tamaño". Las codificaciones son solo asignaciones de bits al personaje que representan. Dicho esto, ASCII es un juego de caracteres de 7 bits (codificación) que a menudo se almacena en 8 bits de espacio. Si limita los rangos que acepta, también puede eliminar los caracteres de control.
El uso de este método significa que tiene que escribir las cosas a nivel de bits, y también juega un poco infierno con la velocidad y las instrucciones de la máquina porque todas las máquinas modernas tienen alineaciones que son múltiplos de 8 bits. Por eso, por ejemplo, Unicode es UTF-8, UTF-16 y UTF-32.
Si está haciendo esto por seguridad (es por eso que lo publicó en Security.SE, ¿verdad?), Simplemente filtre las cosas y guárdelas normalmente. Si está haciendo esto para ahorrar espacio, considere si todo el código adicional y el tiempo de acceso más lento (porque la mayoría de las entradas cruzarán los límites de la dirección) vale la pena el ahorro de espacio.
Por cierto, el siguiente es un fragmento de un curso de CS donde tuvimos que convertir ASCII de almacenamiento de 8 bits a 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