索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
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
|
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
;
}
|
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
);
}
}
|
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
if
(
$button
==
"迅雷地址->普通地址"
)echosubstr(
base64_decode
(
str_ireplace
(
"thunder://"
,
""
,
$txt1
)),2,-2);
?>
"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>
|