La ricodifica dei caratteri viene generalmente eseguita quando il sistema ricevente non può elaborarli. Ad esempio, BASE64 rappresenta i dati utilizzando 6 bit (2 6 , quindi 64) di caratteri per rappresentare sequenze di dati più lunghe (il "==" alla fine che appare alla fine è il riempimento per l'allineamento). Questo perché il tuo file di immagine nell'e-mail potrebbe contenere 0xFE e il tuo server di posta non sarà contento di trasmetterlo (o qualsiasi altro carattere tradizionalmente non stampabile).
Non esiste una codifica che "riduce le dimensioni". Le codifiche sono solo mappature di bit sul carattere che rappresentano. Detto questo, ASCII è un set di caratteri a 7 bit (codifica) che viene spesso memorizzato in 8 bit di spazio. Se limiti gli intervalli che accetti, puoi anche eliminare i caratteri di controllo.
L'uso di questo metodo significa che devi scrivere le cose a livello di bit e gioca anche un po 'all'inferno con la velocità e le istruzioni della macchina perché tutte le macchine moderne hanno allineamenti multipli di 8 bit. Questo, ad esempio, è il motivo per cui Unicode è UTF-8, UTF-16 e UTF-32.
Se lo stai facendo per sicurezza (è per questo che l'hai pubblicato su Security.SE, giusto?), Basta filtrare le cose e archiviarle normalmente. Se lo stai facendo per risparmiare spazio, considera se tutto il codice extra e il tempo di accesso più lento (perché la maggior parte delle voci attraverseranno i confini degli indirizzi) valgono i risparmi di spazio.
A proposito, il seguente è un frammento di un corso CS in cui abbiamo dovuto convertire ASCII da 8 bit di archiviazione a 7 bit:
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