Karakterlerin yeniden kodlanması genellikle alıcı sistem bunları işleyemediğinde yapılır. Örneğin, BASE64, daha uzun veri dizilerini temsil etmek için 6 bitlik (2 6 , dolayısıyla 64) karakter kullanan verileri temsil eder (sonunda görünen "==" hizalama için dolgudır). Bunun nedeni, e-postadaki resim dosyanızın içinde 0xFE olması ve posta sunucunuzun bunu (veya geleneksel olarak yazdırılmayan herhangi bir karakteri) iletmekten mutsuz olmasıdır.
"Boyutu küçülten" kodlama yoktur. Kodlamalar, bitlerin temsil ettikleri karakterle eşleştirilmesidir. Bununla birlikte, ASCII genellikle 8 bitlik alanda depolanan 7 bitlik bir karakter kümesidir (kodlama). Kabul ettiğiniz aralıkları sınırlarsanız, kontrol karakterlerini ayıklayabilirsiniz.
Bu yöntemi kullanmak, bit düzeyinde bir şeyler yazmanız gerektiği anlamına gelir ve ayrıca tüm modern makinelerin 8 bitin katları olan hizalamaları olduğu için makine hızı ve talimatları ile biraz cehennem oynar. Örneğin, Unicode'un UTF-8, UTF-16 ve UTF-32 olmasının nedeni budur.
Bunu güvenlik için yapıyorsanız (bu yüzden Security.SE'de yayınladınız, değil mi?), Sadece şeyleri filtreleyin ve normal şekilde saklayın. Yer kazanmak için bunu yapıyorsanız, tüm ekstra kodların ve daha yavaş erişim süresinin (çoğu giriş adres sınırlarını aşacağından) alan tasarrufuna değip değmeyeceğini düşünün.
Bununla birlikte, ASCII'yi 8 bit depolama alanından 7 bit'e dönüştürmek zorunda kaldığımız CS kursundan bir snippet:
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