通常在接收系统无法处理字符时对字符进行重新编码。例如,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