A recodificação de caracteres geralmente é feita quando o sistema receptor não pode processá-los. Por exemplo, BASE64 está representando dados usando 6 bits (2 6 , portanto, 64) de caracteres para representar seqüências de dados mais longas (o "==" que às vezes aparece no final é preenchido para alinhamento). Isso ocorre porque o arquivo de imagem no e-mail pode ter 0xFE nele e o servidor de correio ficará infeliz ao transmitir isso (ou qualquer outro caractere tradicionalmente não imprimível).
Não há codificação que "reduz o tamanho". Codificações são apenas mapeamentos de bits para o caractere que eles representam. Dito isto, o ASCII é um conjunto de caracteres de 7 bits (codificação) que geralmente é armazenado em 8 bits de espaço. Se você limitar os intervalos aceitos, também poderá eliminar os caracteres de controle.
O uso desse método significa que você precisa escrever as coisas no nível do bit, e isso também é um pouco infernal com a velocidade e as instruções da máquina, porque todas as máquinas modernas têm alinhamentos que são múltiplos de 8 bits. É por isso que, por exemplo, o Unicode é UTF-8, UTF-16 e UTF-32.
Se você estiver fazendo isso por segurança (foi por isso que publicou no Security.SE, certo?), Basta filtrar as coisas e armazená-las normalmente. Se você estiver fazendo isso para economizar espaço, considere se todo o código extra e o tempo de acesso mais lento (porque a maioria das entradas cruzam os limites de endereço) valem a economia de espaço.
By the by, a seguir, é um trecho de um curso de CS em que tivemos que converter ASCII de armazenamento de 8 bits para 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