云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名备案_网站建设优化公司排名_优惠券

小七 141 0

ASCII书中最古老的技巧

如果您已经足够大了(或者有足够的兴趣)花了很多时间来处理ASCII表,那么您可能会遇到一个奇怪的事实:可以只使用按位AND将ASCII文本大写。事实证明,在某些情况下,这不仅仅是一种好奇,而且实际上很有用。以下是ASCII字符0x20(空格)到0x7E(颚化符)。0123456789ABCDEF0123456789ABCDEF+--------------------------------0x20 |!"#$%&'()*+,-/0123456789:;?0x40 |@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_0x60 |`abcdefghijklmnopqrstuvwxyz{124;}~很明显,每个小写字母的ASCII代码比相应的大写字母多0x20。例如,小写的m是0x6D,大写的m是0x4D。由于0x20是一个单位,所以可以通过取ASCII字母的代码并应用和0xDF(屏蔽0x20位)将其大写。Performing和0xDF对上面的前两行没有影响:它们(包括大写字母)没有变化。只有第三排受影响。小写字母大写,但也有一些附带的损害:`{|}~改成@[\]^`。但是如果你知道一个字符串的字符集是有限的,那么这个技巧就会派上用场。许多旧协议(SMTP、POP3、…)的命令都使用USASCI字符。DNS名称通常限于字母、数字和-。甚至HTTP也建议对HTTP头使用USASCII。因此,如果您知道字符串是和0xDF安全的,那么下面的C代码将进行非常快速的不区分大小写的比较://如果x==y(不区分大小写),则返回1int cmp(const char*x,const char*y){while(*x&&*y){如果(*x++&0xdf)!=(*y++&0xdf)){返回0;}}返回(*x==0)&&(*y==0);}当你每秒被数以百万计的DNS数据包攻击,需要做出非常、非常快的过滤决策时,这种低级的骗局就变得很重要了。