通常、文字の再エンコードは、受信側システムが文字を処理できないときに行われます。たとえば、BASE64は、6ビット(2 6、したがって64)の文字を使用してデータを表し、長いデータシーケンスを表します(末尾に表示されることがある「==」は、位置合わせのためのパディングです)。これは、電子メールの画像ファイルに0xFEが含まれている可能性があり、メールサーバーがそれ(またはその他の従来の非印刷文字)を送信することに不満を感じるためです。
「サイズを縮小する」エンコーディングはありません。エンコーディングとは、ビットとそれらが表す文字との単なるマッピングです。つまり、ASCIIは7ビットの文字セット(エンコード)であり、多くの場合8ビットのスペースに格納されます。受け入れる範囲を制限する場合は、制御文字を除外することもできます。
この方法を使用すると、ビットレベルで書き出す必要があります。また、すべての最新のマシンは8ビットの倍数のアライメントを持っているため、マシンの速度と命令で多少の問題が発生します。たとえば、UnicodeがUTF-8、UTF-16、およびUTF-32である理由です。
セキュリティのためにこれを実行している場合(だからSecurity.SEに投稿したのですか?)、物事を除外して通常どおり保存します。スペースを節約するためにこれを行う場合は、余分なコードとアクセス時間の短縮(ほとんどのエントリがアドレスの境界を越えるため)がスペースを節約する価値があるかどうかを検討してください。
ちなみに、次は8ビットストレージから7ビットにASCIIを変換する必要があったCSコースの抜粋です。
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