[db:标题]

摘要:Base64编码和解码在实际中有着较为广泛的应用,各种基础软件一般都提供了该函数的标准接口供用户直接使用,但是效率上各尽不同,本文参考一位高人的文章借用SSE指令对Base64进行了深度的优化,达到了比C#标准接口速度要快进4倍的速度,如果
一、基础原理 Base64是一种用64个Ascii字符来表示任意二进制数据的方法。主要用于将不可打印的字符转换成可打印字符,或者简单的说是将二进制数据编码成Ascii字符。Base64也是网络上最常用的传输8bit字节数据的编码方式之一。 标准的Base64编码方式过程可简单描述如下: 第一步,将每三个字节作为一组,一共是24个二进制位。 第二步,将这24个二进制位分为四组,每个组有6个二进制位。 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。 第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。 复制一段别人的文件对这个算法进行了后续的描述了,我们以英语单词Man如何转成Base64编码。 Text content M a n ASCII 77 97 110 Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 Index 19 22 5 46 Base64-Encoded T W F u 第一步,"M"、"a"、"n"的ASCII值分别是77、97、110,对应的二进制值是01001101、01100001、01101110,将它们连成一个24位的二进制字符串010011010110000101101110。 第二步,将这个24位的二进制字符串分成4组,每组6个二进制位:010011、010110、000101、101110。 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节:00010011、00010110、00000101、00101110。它们的十进制值分别是19、22、5、46。 第四步,根据上表,得到每个值对应Base64编码,即T、W、F、u。 如果字节数不足三,则这样处理: a)二个字节的情况:将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的Base64编码,再在末尾补上一个"="号。 比如,"Ma"这个字符串是两个字节,可以转化成三组00010011、00010110、00010000以后,对应Base64值分别为T、W、E,再补上一个"="号,因此"Ma"的Base64编码就是TWE=。 b)一个字节的情况:将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的Base64编码,再在末尾补上两个"="号。 比如,"M"这个字母是一个字节,可以转化为二组00010011、00010000,对应的Base64值分别为T、Q,再补上二个"="号,因此"M"的Base64编码就是TQ==。 基本就是这个简单的过程。 由以上过程可以看到,Base64编码不是一个压缩过程(反而是个膨胀的过程,处理后体积是增加了1/3的),也不是一个加密过程(没任何密钥)。 二、C语言实现 由上述描述可见这是一个比较简单的过程,通过移位和一些查找表可以快速的写出一个简单的版本。
阅读全文