Перекодирование символов обычно выполняется, когда принимающая система не может их обработать. Например, 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