`
hereson2
  • 浏览: 453804 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用混合脚本编程来实现的Base64编码

阅读更多
在近来的工作中,需要在Web页上制作复杂的逻辑和框架以及后台之间交换数据,特别是和后台交换数据,编码是个必须考虑的问题。否则可能会因为编码不同,把脚本的执行给搞得乱七八糟,根本得不到想要的结果。Base64是一种常用而又简单的编码,就先从它下手弄弄了。

    关于Base64的详细定义可以查看RFC 2045,如果简单的说一下呢:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)。好玩,弄来不被人识别?不识别就不识别嘛,反正程序能之别就行了。

    这个编码为什么叫Base64呢?这是应为它的转换需要依赖一张64个字符的转换表,叫做The Base64 Alphabet。 Base64以3个字节为一个转换单位,把这24bits分为4份,高位补零,再查前面说的那个转换表,就编码完毕了。如果被转换的数据(以byte为单位)不能被3整除,按余数补"="(pad),当然最多也就只有两种可能,不是补一个pad就是补两个pad。

    例如转换"博客园",这三个字的内码十六进制为:B2A9 BFCD D4B0
    二进制为:10110010 10101001 10111111 11001101 11010100 10110000
    六个一拨:00101100 00101010 00100110 00111111 00110011 00011101 00010010 00110000,再按新的编码转为十进制查表后得到"博客园"的base64编码为:"sqm/zdSw"。
    // 蓝色的0是补位的

    之前有人用JavaScript来做过Base64编码,结果居然使用escape来获取字符的编码,这样当遇到被转换的字符有汉字时就faint掉了,escape在基于NT的32位系统下得到的是汉字的Unicode编码。但是JavaScript却真的没有办法得到汉字的GB码:( 我也郁闷了半天,后来在mozart0的帮助下使用VBScript加JScript混合搞定了这个编码算法实现。

    附1:The Base64 Alphabet
     Value Encoding Value Encoding Value Encoding Value Encoding
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 G 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /


    附2:base64编码源代码
<script language="javascript">
var Base64Alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
    'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'];

function EncodeBase64(string)
{
    var hexString = string.getGBCode();
    window.status = hexString;
    var base64 = '';
    var B64A = Base64Alphabet;
    var padCount = hexString.length%3;
    var count = parseInt(hexString.length/6);
    var i = 0;
    for ( i=0 ; i < count ; ++i )
    {
         var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
         var intB = parseInt(hexString.charAt(i*6+2)+hexString.charAt(i*6+3), 16);
         var intC = parseInt(hexString.charAt(i*6+4)+hexString.charAt(i*6+5), 16);
         var part1 = intA >> 2;
         var part2 = ((intA & 0x03) << 4) | (intB >> 4);
         var part3 = ((intB & 0x0f) << 2) | (intC >> 6);
         var part4 = intC & 0x3f;
         base64 += B64A[part1] + B64A[part2] + B64A[part3] + B64A[part4];
    }
    if ( padCount == 1 )
    {
         var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
         var intB = parseInt(hexString.charAt(i*6+2)+hexString.charAt(i*6+3), 16);
         var part1 = intA >> 2;
         var part2 = ((intA & 0x03) << 4) | (intB >> 4);
         var part3 = ((intB & 0x0f) << 2);
         base64 += B64A[part1] + B64A[part2] + B64A[part3] + '=';
    }
    if ( padCount == 2 )
    {
         var intA = parseInt(hexString.charAt(i*6+0)+hexString.charAt(i*6+1), 16);
         var part1 = intA >> 2;
         var part2 = ((intA & 0x03) << 4);
         base64 += B64A[part1] + B64A[part2] + '==';
    }       
    return base64;
}
</script>
<script language="vbscript">
function vbGetGBCode(str)
    dim i, length, s
    length = len(str)
    for i=1 to length
        hexCode = hex(asc(str.charAt(i-1)))
        if (len(hexCode) mod 2) = 0 then
            s = s & hexCode
        else
            s = s & "0" & hexCode
        end if
    next
    vbGetGBCode = s
end function
</script>
<script language="javascript">
String.prototype.getGBCode = function()
{
    return vbGetGBCode(this);
}
</script>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics