Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一
3简介编辑
规则
例子(1)
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
0
|
A
|
17
|
R
|
34
|
i
|
51
|
z
|
1
|
B
|
18
|
S
|
35
|
j
|
52
|
0
|
2
|
C
|
19
|
T
|
36
|
k
|
53
|
1
|
3
|
D
|
20
|
U
|
37
|
l
|
54
|
2
|
4
|
E
|
21
|
V
|
38
|
m
|
55
|
3
|
5
|
F
|
22
|
W
|
39
|
n
|
56
|
4
|
6
|
G
|
23
|
X
|
40
|
o
|
57
|
5
|
7
|
H
|
24
|
Y
|
41
|
p
|
58
|
6
|
8
|
I
|
25
|
Z
|
42
|
q
|
59
|
7
|
9
|
J
|
26
|
a
|
43
|
r
|
60
|
8
|
10
|
K
|
27
|
b
|
44
|
s
|
61
|
9
|
11
|
L
|
28
|
c
|
45
|
t
|
62
|
+
|
12
|
M
|
29
|
d
|
46
|
u
|
63
|
/
|
13
|
N
|
30
|
e
|
47
|
v
|
||
14
|
O
|
31
|
f
|
48
|
w
|
||
15
|
P
|
32
|
g
|
49
|
x
|
||
16
|
Q
|
33
|
h
|
50
|
y
|
例子(2)
4代码实现编辑
BASH版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
base64Table=(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 str2binary() { idx=0; for ((i=0; i<${ #str}; i++)); do dividend=$( printf "%d" "'${str:i:1}" ); for ((j=0;j<8;j++)); do let idx=8*i+7-j; let bin[$idx]=$dividend%2; dividend=$dividend /2 ; done ; done ; let idx=${ #str}*8; for ((i=0; i<appendEqualCnt*2; i++)); do let bin[$idx]=0; let idx++; done ; } function calcBase64() { for ((i=0; i<${ #bin[*]}/6; i++)); do sum =0; for ((j=0; j<6; j++)); do let idx=i*6+j; let n=6-1-j; let sum = sum +${bin[$idx]}*2**n; done ; echo -n ${base64Table[$ sum ]}; done } declare -a bin function base64Encode() { read -p "please enter ASCII string:" str; let appendZero=${ #str}*8%6; let bits=${ #str}*8; appendEqualCnt=0; if [[ $appendZero - ne 0 ]]; then let appendEqualCnt=(6-$appendZero) /2 ; fi str2binary; calcBase64; if [[ $appendEqualCnt - eq 2 ]]; then echo -n "==" ; elif [[ $appendEqualCnt - eq 1 ]]; then echo -n "=" ; fi echo ; } |
Java版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
//模板类模板类写好了再按思路写个实现就可以了 publicinterfaceBase64{ /** *根据传进来的字符的字节码,查询base64码表的索引,并返回所查到的索引 * *@paramb一个编码后的字节码 *@return返回base64码表的索引 */ publicabstractbytebaseIndex(byteb); /** *解码的方法 *传进来的是编码后的base64字符的字节码 *解析时是4个一组进行解析 *@paramb编码后的字符的字节码数组 *@return返回原来的字符串 */ publicabstractStringbackEncode( byte []b); /** *解码 *将4个字节码中的第1个的后6位(00xxxxxx)和第2个 *字节的前4位的后2位(00yy0000) *还原为原来的字节码(xxxxxxyy) * *@paramfirst4个字节码中的第1个 *@paramsecond4个字节码中的第2个 *@return原来的字符的字节码 */ publicabstractbytebackFirst(bytefirst,bytesecond); /** *解码 *将4个字节码中的第2个的后4位(0000xxxx)和第3个 *字节的前6位的后4位(00yyyy00) *还原为原来的字节码(xxxxyyyy) *@paramsecond4个字节码中的第2个 *@paramthird4个字节码中的第3个 *@return原来的字符的字节码 */ publicabstractbytebackSecond(bytesecond,bytethird); /** *解码 *将4个字节码中的第3个的后2位(000000xx)和第4个 *字节的后6位(00yyyyyy) *还原为原来的字节码(xxyyyyyy) *@paramthird传进来的第3个字符 *@paramfourth传进来的第4个字符 *@return原来的字符的字节码 */ publicabstractbytebackThird(bytethird,bytefourth); /** *解码 *将编码后的字符串数组的最后2个字节码还原为原来的字节码 *假如数组末尾剩下2个字节: *将倒数第2个字节的前后6位(00xxxxxx) *和倒数第一个字节的后2位(000000yy) *还原为原来的编码(xxxxxxyy) *假如数组末尾剩下3个字节: *将倒数第2个字节的前后4位(0000xxxx) *和倒数第一个字节的后4位(0000yyyy) *还原为原来的编码(xxxxyyyy) *@paramlast_b倒数第2个字节 *@paramnext_b倒数第1个字节 *@parammove_l倒数第2个字节移动位数的参数 *@parammove_b倒数第1个字节移动位数的参数 *@return原来的字符的字节码 */ publicbytebackLastOne(bytelast_b,bytenext_b,intmove_l,intmove_b); /** *编码 *将传进来的字符编码为base64,返回一个base64的字符串 *编码时3个字节一组进行编码,传进来的是要进行编码的字符串数组 *@paramb要进行编码的字符串数组 *@return编码后的字符串 */ publicabstractStringencode( byte []b); /** *假如字符长度%3!=0,使用此方法编码末尾字符 *假如b=xxxxyyyy *假如末尾字节个数等于1: *将这个字节的前6位作为一个字节(00xxxxyy) *将这个字节的后6位作为一个字节(00xxyyyy) *假如末尾字节个数等于2: *将这个字节的后6位作为一个字节(00xxyyyy) *@paramb末尾的字符的字节码 *@parammove末尾的字符的字节码要移动的位数的参数 *@return编码后的字节码 */ publicabstractbytelastOneByte(byteb,intmove); /** *编码 *假如b=xxxxyyyy *将第1个字节的前6位编码为base64 *将3个字节中的第1个子节码转为(00xxxxyy) *@paramb3个字节中的第1个字节 *@return编码后的字节码 */ publicabstractbytefirstByte(byteb); /** *编码 *假如last_b=xxxxyyyynext_b=kkkkffff *将3个字节中的第1个字节的最后2位(000000yy) *和第2个字节的前4位(kkkk0000)编码为(00yykkkk) * *@paramlast_b3个字节中的第1个字节 *@paramnext_b3个字节中的第2个字节 *@return编码后的字节码 */ publicabstractbytesecondByte(bytelast_b,bytenext_b); /** *编码 *假如last_b=xxxxyyyynext_b=kkkkffff *将3个字节中的第2个字节的最后4位(0000yyyy) *和第4个字节的前2位(kk000000)编码为(00yyyykk) * * *@paramlast_b3个字节中的第2个字节 *@paramnext_b3个字节中的第3个字节 *@return编码后的字节码 */ publicabstractbytethirdByte(bytelast_b,bytenext_b); /** *编码 *假如b=xxxxyyyy *将3个字节中的第3个字节的最后6位(00xxyyyy) *转码为(00xxyyyy) *@paramb3个字节中的第3个字节 *@return编码后的字节码 */ publicabstractbytefourthByte(byteb); } ======================以下是实现类代码=====================分界线====== importjava.util.Enumeration; importjava.util.Vector; publicclassMyBase64EncoderimplementsBase64{ /** *base64码表 */ privatestaticfinalbytebase[]={ 0x41 , 0x42 , 0x43 , 0x44 , 0x45 , 0x46 , 0x47 , 0x48 , 0x49 , 0x4a , 0x4b , 0x4c , 0x4d , 0x4e , 0x4f , 0x50 , 0x51 , 0x52 , 0x53 , 0x54 , 0x55 , 0x56 , 0x57 , 0x58 , 0x59 , 0x5a , 0x61 , 0x62 , 0x63 , 0x64 , 0x65 , 0x66 , 0x67 , 0x68 , 0x69 , 0x6a , 0x6b , 0x6c , 0x6d , 0x6e , 0x6f , 0x70 , 0x71 , 0x72 , 0x73 , 0x74 , 0x75 , 0x76 , 0x77 , 0x78 , 0x79 , 0x7a , 0x30 , 0x31 , 0x32 , 0x33 , 0x34 , 0x35 , 0x36 , 0x37 , 0x38 , 0x39 , 0x2b , 0x2f }; |
1
2
3
4
5
6
7
8
9
|
@Override publicbytebaseIndex(byteb){ for (inti= 0 ;i<base.length;i++){ if (base[i]==b){ return ( byte )i; } } return - 1 ; } |
1
2
3
4
5
6
7
8
|
@Override publicStringbackEncode( byte []b){ StringBuffersb=newStringBuffer(); Vector<Byte>list=newVector<Byte>(); intreal_len=b.length; intlen=real_len- 2 ; intmore_len=len& 3 ; intuse_len=len-more_len; |
1
2
3
4
5
6
7
8
9
10
11
12
|
for (inti= 0 ;i<use_len;i+= 4 ){ list.add(backFirst(baseIndex(b[i]),baseIndex(b[i+ 1 ]))); list.add(backSecond(baseIndex(b[i+ 1 ]),baseIndex(b[i+ 2 ]))); list.add(backThird(baseIndex(b[i+ 2 ]),baseIndex(b[i+ 3 ]))); } Enumeratione=list.elements(); bytebytes[]=newbyte[list.size()]; intk=- 1 ; while (e.hasMoreElements()){ bytes[++k]=(Byte)e.nextElement(); } sb.append(newString(bytes)); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
if (more_len== 2 ){ byteb_1[]=newbyte[ 1 ]; b_1[ 0 ]=backLastOne(baseIndex(b[len- 2 ]),baseIndex(b[len- 1 ]), 2 , 6 ); sb.append(newString(b_1)); } if (more_len== 3 ){ byteb_2[]=newbyte[ 2 ]; b_2[ 0 ]=backFirst(baseIndex(b[len- 3 ]),baseIndex(b[len- 2 ])); b_2[ 1 ]=backLastOne(baseIndex(b[len- 2 ]),baseIndex(b[len- 1 ]), 4 , 4 ); sb.append(newString(b_2)); } returnsb.toString(); } @Override publicbytelastOneByte(byteb,intmove){ intr_b=b& 0xff ; r_b=r_b<<move; r_b=r_b>>> 2 ; return ( byte )(r_b& 0x3f ); } @Override publicbytebackLastOne(bytelast_b,bytenext_b,intmove_l,intmove_b){ intr_l=last_b& 0xff ; intr_n=next_b& 0xff ; r_l=r_l<<move_l; r_n=r_n<<move_b; r_n=r_n>>>move_b; return ( byte )((r_l|r_n)& 0xff ); } @Override publicbytebackFirst(bytefirst,bytesecond){ intr_f=first& 0xff ; intr_s=second& 0xff ; r_f=r_f<< 2 ; r_s=r_s>>> 4 ; return ( byte )((r_f|r_s)& 0xff ); } |
1
2
3
4
5
6
7
8
|
@Override publicbytebackSecond(bytesecond,bytethird){ intr_s=second& 0xff ; intr_t=third& 0xff ; r_s=r_s<< 4 ; r_t=r_t>>> 2 ; return ( byte )((r_s|r_t)& 0xff ); } |
1
2
3
4
5
6
7
|
@Override publicbytebackThird(bytethird,bytefourth){ intr_t=third& 0xff ; intr_f=fourth& 0xff ; r_t=r_t<< 6 ; return ( byte )((r_t|r_f)& 0xff ); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
@Override publicStringencode( byte []b){ StringBuffersb=newStringBuffer(); intlen=b.length; intmore_len=len% 3 ; intuse_len=len-more_len; byte []bytes=newbyte[ 4 ]; for (inti= 0 ;i<use_len;i+= 3 ){ bytes[ 0 ]=base[firstByte(b[i])]; bytes[ 1 ]=base[secondByte(b[i],b[i+ 1 ])]; bytes[ 2 ]=base[thirdByte(b[i+ 1 ],b[i+ 2 ])]; bytes[ 3 ]=base[fourthByte(b[i+ 2 ])]; sb.append(newString(bytes)); } if (more_len== 1 ){ byteb_2[]=newbyte[ 2 ]; b_2[ 0 ]=base[firstByte(b[len- 1 ])]; b_2[ 1 ]=base[lastOneByte(b[len- 1 ], 6 )]; sb.append(newString(b_2)); returnsb.append( "==" ).toString(); }elseif(more_len== 2 ){ byteb_3[]=newbyte[ 3 ]; b_3[ 0 ]=base[firstByte(b[len- 2 ])]; b_3[ 1 ]=base[secondByte(b[len- 2 ],b[len- 1 ])]; b_3[ 2 ]=base[lastOneByte(b[len- 1 ], 4 )]; sb.append(newString(b_3)); returnsb.append( "=" ).toString(); } returnsb.toString(); } |
1
2
3
4
5
6
7
8
|
@Override publicbytefirstByte(byteb){ //00000000000000000000000001010011 //01010011 intr_f=b& 0xff ; r_f=r_f>>> 2 ; return ( byte )(r_f& 0x3f ); } |
1
2
3
4
5
6
7
8
9
|
@Override publicbytesecondByte(bytelast_b,bytenext_b){ intr_l=last_b& 0xff ; intr_n=next_b& 0xff ; r_l=r_l<< 6 ; r_l=r_l>>> 2 ; r_n=r_n>>> 4 ; return ( byte )((r_l|r_n)& 0x3f ); } |
1
2
3
4
5
6
7
8
9
|
@Override publicbytethirdByte(bytelast_b,bytenext_b){ intr_l=last_b& 0xff ; intr_n=next_b& 0xff ; r_l=r_l<< 4 ; r_l=r_l>>> 2 ; r_n=r_n>>> 6 ; return ( byte )((r_l|r_n)& 0x3f ); } |
1
2
3
4
5
6
7
8
|
@Override publicbytefourthByte(byteb){ intr_b=b& 0xff ; r_b=r_b<< 2 ; r_b=r_b>>> 2 ; return ( byte )(r_b& 0x3f ); } } |
PHP版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
<?php $txt1 =trim( $_POST [ 'text1' ]); $txt2 =trim( $_POST [ 'text2' ]); $txt3 =trim( $_POST [ 'text3' ]); $button = $_POST [ 'button' ]; ?> <!DOCTYPEHTMLPUBLIC "-//W3C//DTDHTML4.0Transitional//EN" > <html> <head> <title>迅雷和FlashGet,QQ旋风地址地址转换工具</title> <metahttp-equiv= "Content-Type" content= "text/html;charset=gb2312" > <metacontent= "迅雷,FlashGet,地址转换," name= "keywords" > </head> <body> <formname= "form1" method= "post" action= "" > <hrsize= "1" > <h3>迅雷转换</h3> <P>转换地址: <inputname= "text1" value= "<?phpecho$txt1;?>" type= "text" style= "width:516px;" /></P> <P>转换后的: <inputtype= "text" value="<?php ?> "style=" width:516px;"/></P> <P> <inputtype= "submit" name= "button" value= "普通地址->迅雷地址" /> <inputtype= "submit" name= "button" value= "迅雷地址->普通地址" /></P> <h3>FlashGet转换</h3> <P>FlashGet地址: <inputname= "text2" value= "<?phpecho$txt2;?>" type= "text" style= "width:516px;" /></P> <P>转换后地址: <inputtype= "text" value="<?php if ( $button == "FlashGet地址->普通地址" )echostr_ireplace( "[FLASHGET]" , "" , base64_decode ( str_ireplace ( "flashget://" , "" , $txt2 ))); ?> "style=" width:516px;"/></P> <P> <inputtype= "submit" value= "普通地址->FlashGet地址" name= "button" /> <inputtype= "submit" value= "FlashGet地址->普通地址" name= "button" /></P> <h3>QQ旋风转换</h3> <P>QQ旋风地址: <inputname= "text3" value= "<?phpecho$txt3;?>" type= "text" style= "width:516px;" /></P> <P>转换后地址: <inputtype= "text" value="<?php ?> "style=" width:516px;"/></P> <P> <inputtype= "submit" value= "普通地址->QQ旋风" name= "button" /> <inputtype= "submit" value= "QQ旋风->普通地址" name= "button" /></P> </form> </body> </html> |
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一的更多相关文章
- Word 录制宏解决粘贴网络上文字格式错乱
本文将利用Word中的录制宏来解决 复制粘贴网络上文字格式错乱的问题. 本文宏代码取自 : 知乎 李文超,感谢他的提供. Technorati 标签: Word宏 格式修正 1 ...
- 使用异步任务加载网络上json数据并加载到ListView中
Android中使用网络访问来加载网上的内容,并将其解析出来加载到控件中,是一种很常见的操作.但是Android的UI线程(也就是主线程)中是不允许进行耗时操作的,因为耗时操作会阻塞主线程,影响用户体 ...
- 从输入一个URL到页面呈现,网络上都发生了什么?
归纳一下其中涉及到前端的一些基础知识,主要包括:http协议.web标准.w3c标准等. 这个问题虽然只有两个2个动作:输入URL和呈现页面,但这背后发生了很多"有趣" ...
- Java 网络编程(三) 创建和使用URL访问网络上的资源
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951877.html 创建和使用URL访问网络上的资源 URL(Uniform Reso ...
- VXLAN, 一种叠加在L3网络上的L2网络
这几天看了下RFC7348,顺便翻译了一下,根据自己理解做了注解 虚拟化及租户隔离 服务器虚拟化增加了对物理网络基础设施的需求,服务器有多个虚机,要求交换机支持更大的MAC地址表. 在数据中心场景下, ...
- 编码占用的字节数 1 byte 8 bit 1 sh 1 bit 中文字符编码 2. 字符与编码在程序中的实现 变长编码 Unicode UTF-8 转换 在网络上传输 保存到磁盘上 bytes
小结: 1.UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等: 2 服务器->网页 utf-8 ...
- golang thrift 总结一下网络上的一些坑
我们以hello world来大概分析一下golang中的thrift包,并且扒一扒网络上有关thrift的一些坑 查看源码,服务器定义如下:(详见simple_server.go文件) type T ...
- ios 从网络上获取图片并在UIImageView中显示
ios 从网络上获取图片 -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIIm ...
- JWebFileTrans(JDownload): 一款可以从网络上下载文件的小程序(三),多线程断点下载
一 前言 本篇博客是<JWebFileTrans(JDownload):一款可以从网络上下载文件的小程序>系列博客的第三篇,本篇博客的内容主要是在前两篇的基础上增加多线程的功能.简言之,本 ...
随机推荐
- C/C++(C++返回对象与应用区别,类成员的存储)
返回对象与应用区别: 拷贝构造器发生的时机: 1.构造新对象 A a, A b = a; 2.传参或返回对象 对于普通变量来说,传引用效果不是很明显,对于类对象而言,传对象效果很高. 传引用等价于扩大 ...
- BZOJ3105: [cqoi2013]新Nim游戏(Xor线性无关组)
Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...
- Android学习总结(2)——App客户端与服务器交互中的token
学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...
- [Python] Read and Parse Files in Python
This lesson will teach you how to read the contents of an external file from Python. You will also l ...
- 自写的开发框架,胜于官方的clientAPP的实战开发。(已开源)
已开源,欢迎大家fork 小弟github地址为https://github.com/10045125/vanda 好久没写博客了,这段时间主要是要做的事情太多.如今接触android有段时间了.非常 ...
- 消灭星星的数组高效率算法(c++代码,控制台程序)
#include <iostream> using namespace std; #define ROW 12 #define COL 10 class Star { public: en ...
- SSL通关之代码演示样例(四)
实际开发过程中,server端是不须要多加代码处理的,由于ssl验证过程是由server(tomcat.nginx等)完毕的. 这段代码也是參考了网上的: 新建一个web项目,项目结构和须要引入的ja ...
- 运行maven项目出现的报错
java问题:严重: Error configuring application listener of class org.springframework.web.context.Cont 解决方案 ...
- Token ,Cookie和Session的区别--学习笔记
http://blog.csdn.net/tobetheender/article/details/52485948 Token token的意思是“令牌”,是用户身份的验证方式,最简单的token组 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...