Ponowne kodowanie znaków jest zwykle wykonywane, gdy system odbiorczy nie może ich przetworzyć. Na przykład BASE64 reprezentuje dane przy użyciu 6 bitów (2 6 , a więc 64) znaków, które reprezentują dłuższe sekwencje danych (czasami pojawiające się „==” na końcu to dopełnienie do wyrównania). Wynika to z faktu, że plik obrazu w wiadomości e-mail może zawierać 0xFE, a serwer pocztowy będzie niezadowolony z przesyłania tego (lub innego tradycyjnie nie drukującego znaku).
Nie ma kodowania, które „zmniejsza rozmiar”. Kodowanie to tylko odwzorowanie bitów na znak, który reprezentują. To powiedziawszy, ASCII to 7-bitowy zestaw znaków (kodowanie), który często jest przechowywany w 8 bitach przestrzeni. Jeśli ograniczysz zakresy, które akceptujesz, możesz także usunąć znaki kontrolne.
Korzystanie z tej metody oznacza, że musisz zapisywać rzeczy na poziomie bitów, a także gra trochę piekła z szybkością maszyny i instrukcjami, ponieważ wszystkie nowoczesne maszyny mają wyrównania, które są wielokrotnościami 8 bitów. Dlatego na przykład Unicode to UTF-8, UTF-16 i UTF-32.
Jeśli robisz to dla bezpieczeństwa (dlatego opublikowałeś go w Security.SE, prawda?), Po prostu odfiltruj rzeczy i przechowuj je normalnie. Jeśli robisz to, aby zaoszczędzić miejsce, zastanów się, czy cały dodatkowy kod i wolniejszy czas dostępu (ponieważ większość wpisów przekroczy granice adresów) jest warta oszczędności miejsca.
Do tego czasu to fragment kodu kursu CS, w którym musieliśmy przekonwertować ASCII z pamięci 8-bitowej na 7-bitową:
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