使用混合脚本编程来实现的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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值