Pengodean ulang karakter umumnya dilakukan ketika sistem penerima tidak dapat memprosesnya. Sebagai contoh, BASE64 merepresentasikan data menggunakan 6 bit (2 6 , karenanya 64) karakter untuk mewakili urutan data yang lebih panjang ("==" yang terkadang muncul pada akhirnya adalah padding untuk penyelarasan). Ini karena file gambar Anda dalam email mungkin memiliki 0xFE di dalamnya dan server email Anda akan tidak senang mentransmisikannya (atau karakter tradisional yang tidak dicetak).
Tidak ada pengkodean yang "mengurangi ukuran." Pengkodean hanyalah pemetaan bit ke karakter yang diwakilinya. Yang mengatakan, ASCII adalah set karakter 7 bit (encoding) yang sering disimpan dalam ruang 8 bit. Jika Anda membatasi rentang yang Anda terima, Anda juga dapat menghilangkan karakter kontrol.
Menggunakan metode ini berarti Anda harus menulis hal-hal pada tingkat bit, dan juga memainkan sedikit neraka dengan kecepatan & instruksi mesin karena semua mesin modern memiliki keberpihakan yang merupakan kelipatan dari 8 bit. Misalnya, itulah sebabnya Unicode adalah UTF-8, UTF-16, dan UTF-32.
Jika Anda melakukan ini untuk keamanan (itu sebabnya Anda mempostingnya di Security.SE, kan?), Cukup filter dan simpan secara normal. Jika Anda melakukan ini untuk menghemat ruang, pertimbangkan apakah semua kode tambahan dan waktu akses lebih lambat (karena sebagian besar entri akan melewati batas alamat) sepadan dengan penghematan ruang.
Oleh, berikut ini adalah cuplikan dari kursus CS di mana kami harus mengubah ASCII dari penyimpanan 8 bit menjadi 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