class
Base64New:
RANGE
=
255
Base64ByteToStr
=
[
'i'
,
'5'
,
'j'
,
'L'
,
'W'
,
'7'
,
'S'
,
'0'
,
'G'
,
'X'
,
'6'
,
'u'
,
'f'
,
'1'
,
'c'
,
'v'
,
'3'
,
'n'
,
'y'
,
'4'
,
'q'
,
'8'
,
'e'
,
's'
,
'2'
,
'Q'
,
'+'
,
'b'
,
'd'
,
'k'
,
'Y'
,
'g'
,
'K'
,
'O'
,
'I'
,
'T'
,
'/'
,
't'
,
'A'
,
'x'
,
'U'
,
'r'
,
'F'
,
'l'
,
'V'
,
'P'
,
'z'
,
'h'
,
'm'
,
'o'
,
'w'
,
'9'
,
'B'
,
'H'
,
'C'
,
'M'
,
'D'
,
'p'
,
'E'
,
'a'
,
'J'
,
'R'
,
'Z'
,
'N'
]
StrToBase64Byte
=
{char: idx
for
idx, char
in
enumerate
(Base64ByteToStr)}
def
Base64Encode(
self
, bytes):
res
=
[]
for
i
in
range
(
0
,
len
(bytes),
3
):
enBytes
=
[
0
]
*
4
tmp
=
0
for
k
in
range
(
3
):
if
i
+
k <
len
(bytes):
enBytes[k]
=
((bytes[i
+
k] &
255
) >> ((k
*
2
)
+
2
)) | tmp
tmp
=
(((bytes[i
+
k] &
255
) << ((
2
-
k)
*
2
+
2
)) &
255
) >>
2
else
:
enBytes[k]
=
tmp
tmp
=
64
enBytes[
3
]
=
tmp
for
k2
in
range
(
4
):
if
enBytes[k2] <
=
63
:
res.append(
self
.Base64ByteToStr[enBytes[k2]])
else
:
res.append(
'='
)
return
''.join(res)
def
Base64Decode(
self
, encoded_str):
decoded_bytes
=
bytearray()
for
i
in
range
(
0
,
len
(encoded_str),
4
):
enChars
=
encoded_str[i:i
+
4
]
deBytes
=
[
0
]
*
4
for
k
in
range
(
4
):
if
enChars[k] !
=
'='
:
deBytes[k]
=
self
.StrToBase64Byte[enChars[k]]
decoded_bytes.extend((((deBytes[
0
] <<
2
) &
255
) | (deBytes[
1
] >>
4
)).to_bytes(
1
,
'big'
))
if
enChars[
2
] !
=
'='
and
len
(enChars) >
2
:
decoded_bytes.extend((((deBytes[
1
] <<
4
) &
255
) | (deBytes[
2
] >>
2
)).to_bytes(
1
,
'big'
))
if
enChars[
3
] !
=
'='
and
len
(enChars) >
3
:
decoded_bytes.extend((((deBytes[
2
] <<
6
) &
255
) | deBytes[
3
]).to_bytes(
1
,
'big'
))
return
decoded_bytes
data_to_encode
=
b
'abcdefgabcdefgabcdefgab'
base64_encoder
=
Base64New()
encoded_data
=
base64_encoder.Base64Encode(data_to_encode)
print
(
"编码结果:"
, encoded_data)
decoded_data
=
base64_encoder.Base64Decode(encoded_data)
print
(
"解码结果:"
, decoded_data)