鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 422, 文章 - 228, 评论 - 5339, 引用 - 172
数据加载中……

使用混合脚本编程来实现的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"></script>
<script language="vbscript"></script>
<script language="javascript"></script>

    附3:在线测试 http://zhilee.aehk.com/demo/TestBase64.htm

posted on 2005-01-12 00:07 birdshome 阅读(3766) 评论(17)  编辑 收藏 所属分类: Jscript&Dhtml开发

评论

#1楼    回复  引用  查看    

Good idea~
2005-01-12 08:25 | minbear      

#2楼    回复  引用  查看    

到鸟窝来拍砖,但愿别拍到鸟蛋:—P

PS:兄台的script语言好强的说
2005-01-13 00:26 | Maverick      

#3楼    回复  引用  查看    

有没有解码的脚本呢?
2005-01-13 10:07 | 3309 [未注册用户]

#4楼 [楼主]   回复  引用  查看    

遇到点小问题,不过正在解决中。
2005-01-13 20:40 | birdshome      

#5楼 [楼主]   回复  引用  查看    

已实现了Base64解码的脚本,enjoy it!
2005-01-15 02:09 | birdshome      

#6楼    回复  引用  查看    

好。
这段时间正好在看关于邮件编码的资料。估计这下又省点力气了。哈哈
2005-01-16 10:00 | transbaker [未注册用户]

#7楼    回复  引用  查看    

那个是 gb 码吗?
2005-01-26 15:04 | guoshuang [未注册用户]

#8楼 [楼主]   回复  引用  查看    

哪个?邮件编码吗?!
2005-01-27 01:31 | birdshome      

#9楼    回复  引用  查看    

请问在编码之前是不是要先转化为二进制
比如要对kgditfkwvfp@163.com进行编码
2005-06-24 23:03 | king [未注册用户]

#10楼    回复  引用  查看    

你的测试页面不能用,这里的中文测试通过

http://bbs.mscommunity.com/Forums/ShowThread.aspx?PostID=2349

2005-09-20 10:42 | ccBoy      

#11楼 [楼主]   回复  引用  查看    

@ccBoy
你给的这个base64代码转换"博客园"的结果是:5Y2a5a6i5Zut
但是"博客园"的base64编码应该是:sqm/zdSw
我给出的示例转换后也是:sqm/zdSw
2005-09-20 16:05 | birdshome      

#12楼    回复  引用  查看    

解码不好用!!!!
2005-11-09 10:49 | 不解呵 [未注册用户]

#13楼    回复  引用  查看    

其实我觉得ccBoy给的页面挺不错的,完全是按算法做的,只是将原始字符串编码成UTF8再处理,我想,鸟鸟给的应该是把中文转成GB2312,然后直接对其编成Base64,在我看来,ccBoy给的更直观,更正确。[我并不知道"博客园"的base64编码应该是什么^_^]
2005-12-24 12:02 | 黄宗银 [未注册用户]

#14楼    回复  引用  查看    

牛啊。
我在网上找到另一个,编出来的base64就是不行。跟php自带的不一样。但老兄给的这个一样了。

顺便说下我的方案:
c->s
客户端把 string 打包成 base64
再通过 xml http 传到服务器
服务器用 php 自带的 base64_decode 解出来,写进文件或数据库

s->c
data from file
convert to base64
client get it by xmlhttp
clinet decode it

为什么这样?
因为 xmlhttp 所有的请求与响应都是 utf8
php好像没这东西,而且我的文件是gb的。
php 要装个 aconv ,搞了半天都不行
2005-12-24 14:32 | Leon.Z [未注册用户]

#15楼    回复  引用  查看    

@king
@king
是不是要先改为二进制?
2006-03-16 19:52 | 大菜鸟 [未注册用户]

#16楼    回复  引用  查看    

太强了,慢慢看! ^_^
2006-08-05 22:21 | 风之石 [未注册用户]

#17楼    回复  引用  查看    

找了好久了,需要的就是这个。前段时间看到一个可行的,但那个人用的是编码库的方式,就是整个函数太大了,有70多k呢。这个虽好,但也是有点不足,两种编码的不好做成单独的包含文件啊。
总之这个思路很好。谢谢你。
2006-08-25 18:05 | zhuwenya [未注册用户]