Перекодування символів, як правило, робиться, коли приймаюча система не може їх обробити. Наприклад, BASE64 представляє дані, використовуючи 6 бітів (2 6 , отже 64) символів для представлення довших послідовностей даних (іноді з'являється "==" в кінці є заміщенням для вирівнювання). Це тому, що у вашому файлі зображень в електронній пошті може бути 0xFE в ньому, і ваш поштовий сервер буде незадоволено передавати це (або будь-який інший традиційно недрукувальний символ).
Не існує кодування, яке "зменшує розмір". Кодування - це просто зіставлення бітів із символом, який вони представляють. Однак, ASCII - це 7-бітний набір символів (кодування), який часто зберігається у 8 бітах простору. Якщо ви обмежите діапазони, які ви приймаєте, ви також можете вилучити контрольні символи.
Використання цього методу означає, що вам потрібно виписати речі на рівні бітів, а також він грає трохи пекла зі швидкістю та інструкціями машини, оскільки всі сучасні машини мають вирівнювання, кратні 8 біт. Наприклад, чому Unicode - це UTF-8, UTF-16 та UTF-32.
Якщо ви робите це для безпеки (саме тому ви розмістили його на Security.SE, правда?), Просто відфільтруйте речі та зберігайте їх у звичайному режимі. Якщо ви робите це для економії місця, подумайте, чи варто зайвий код та уповільнений час доступу (оскільки більшість записів перетинають межі адреси) варто економії місця.
До речі, наступний фрагмент курсу CS, де нам довелося перетворити ASCII з 8-бітового сховища до 7-бітного:
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