代码拉取完成,页面将自动刷新
# uncompyle6 version 3.2.3
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.6.8 |Anaconda custom (64-bit)| (default, Feb 21 2019, 18:30:04) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: base64.py
"""Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data encodings"""
import re, struct, binascii
__all__ = [
"encode",
"decode",
"encodebytes",
"decodebytes",
"b64encode",
"b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
"b85encode",
"b85decode",
"a85encode",
"a85decode",
"standard_b64encode",
"standard_b64decode",
"urlsafe_b64encode",
"urlsafe_b64decode",
]
bytes_types = (bytes, bytearray)
def _bytes_from_decode_data(s):
if isinstance(s, str):
try:
return s.encode("ascii")
except UnicodeEncodeError:
raise ValueError("string argument should contain only ASCII characters")
if isinstance(s, bytes_types):
return s
try:
return memoryview(s).tobytes()
except TypeError:
raise TypeError(
"argument should be a bytes-like object or ASCII string, not %r"
% s.__class__.__name__
) from None
def b64encode(s, altchars=None):
"""Encode the bytes-like object s using Base64 and return a bytes object.
Optional altchars should be a byte string of length 2 which specifies an
alternative alphabet for the '+' and '/' characters. This allows an
application to e.g. generate url or filesystem safe Base64 strings.
"""
encoded = binascii.b2a_base64(s, newline=False)
if altchars is not None:
if not len(altchars) == 2:
raise AssertionError(repr(altchars))
return encoded.translate(bytes.maketrans(b"+/", altchars))
else:
return encoded
def b64decode(s, altchars=None, validate=False):
"""Decode the Base64 encoded bytes-like object or ASCII string s.
Optional altchars must be a bytes-like object or ASCII string of length 2
which specifies the alternative alphabet used instead of the '+' and '/'
characters.
The result is returned as a bytes object. A binascii.Error is raised if
s is incorrectly padded.
If validate is False (the default), characters that are neither in the
normal base-64 alphabet nor the alternative alphabet are discarded prior
to the padding check. If validate is True, these non-alphabet characters
in the input result in a binascii.Error.
"""
s = _bytes_from_decode_data(s)
if altchars is not None:
altchars = _bytes_from_decode_data(altchars)
if not len(altchars) == 2:
raise AssertionError(repr(altchars))
s = s.translate(bytes.maketrans(altchars, b"+/"))
if validate:
if not re.match(b"^[A-Za-z0-9+/]*={0,2}$", s):
raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s)
def standard_b64encode(s):
"""Encode bytes-like object s using the standard Base64 alphabet.
The result is returned as a bytes object.
"""
return b64encode(s)
def standard_b64decode(s):
"""Decode bytes encoded with the standard Base64 alphabet.
Argument s is a bytes-like object or ASCII string to decode. The result
is returned as a bytes object. A binascii.Error is raised if the input
is incorrectly padded. Characters that are not in the standard alphabet
are discarded prior to the padding check.
"""
return b64decode(s)
_urlsafe_encode_translation = bytes.maketrans(b"+/", b"-_")
_urlsafe_decode_translation = bytes.maketrans(b"-_", b"+/")
def urlsafe_b64encode(s):
"""Encode bytes using the URL- and filesystem-safe Base64 alphabet.
Argument s is a bytes-like object to encode. The result is returned as a
bytes object. The alphabet uses '-' instead of '+' and '_' instead of
'/'.
"""
return b64encode(s).translate(_urlsafe_encode_translation)
def urlsafe_b64decode(s):
"""Decode bytes using the URL- and filesystem-safe Base64 alphabet.
Argument s is a bytes-like object or ASCII string to decode. The result
is returned as a bytes object. A binascii.Error is raised if the input
is incorrectly padded. Characters that are not in the URL-safe base-64
alphabet, and are not a plus '+' or slash '/', are discarded prior to the
padding check.
The alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
s = _bytes_from_decode_data(s)
s = s.translate(_urlsafe_decode_translation)
return b64decode(s)
_b32alphabet = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
_b32tab2 = None
_b32rev = None
def b32encode(s):
"""Encode the bytes-like object s using Base32 and return a bytes object.
"""
global _b32tab2
if _b32tab2 is None:
b32tab = [bytes((i,)) for i in _b32alphabet]
_b32tab2 = [a + b for a in b32tab for b in iter(b32tab)]
b32tab = None
if not isinstance(s, bytes_types):
s = memoryview(s).tobytes()
leftover = len(s) % 5
if leftover:
s = s + b"\x00" * (5 - leftover)
encoded = bytearray()
from_bytes = int.from_bytes
b32tab2 = _b32tab2
for i in range(0, len(s), 5):
c = from_bytes(s[i : i + 5], "big")
encoded += (
b32tab2[c >> 30]
+ b32tab2[c >> 20 & 1023]
+ b32tab2[c >> 10 & 1023]
+ b32tab2[c & 1023]
)
if leftover == 1:
encoded[-6:] = b"======"
else:
if leftover == 2:
encoded[-4:] = b"===="
else:
if leftover == 3:
encoded[-3:] = b"==="
else:
if leftover == 4:
encoded[-1:] = b"="
return bytes(encoded)
def b32decode(s, casefold=False, map01=None):
"""Decode the Base32 encoded bytes-like object or ASCII string s.
Optional casefold is a flag specifying whether a lowercase alphabet is
acceptable as input. For security purposes, the default is False.
RFC 3548 allows for optional mapping of the digit 0 (zero) to the
letter O (oh), and for optional mapping of the digit 1 (one) to
either the letter I (eye) or letter L (el). The optional argument
map01 when not None, specifies which letter the digit 1 should be
mapped to (when map01 is not None, the digit 0 is always mapped to
the letter O). For security purposes the default is None, so that
0 and 1 are not allowed in the input.
The result is returned as a bytes object. A binascii.Error is raised if
the input is incorrectly padded or if there are non-alphabet
characters present in the input.
"""
global _b32rev
if _b32rev is None:
_b32rev = {v: k for k, v in enumerate(_b32alphabet)}
s = _bytes_from_decode_data(s)
if len(s) % 8:
raise binascii.Error("Incorrect padding")
if map01 is not None:
map01 = _bytes_from_decode_data(map01)
if not len(map01) == 1:
raise AssertionError(repr(map01))
s = s.translate(bytes.maketrans(b"01", b"O" + map01))
if casefold:
s = s.upper()
l = len(s)
s = s.rstrip(b"=")
padchars = l - len(s)
decoded = bytearray()
b32rev = _b32rev
for i in range(0, len(s), 8):
quanta = s[i : i + 8]
acc = 0
try:
for c in quanta:
acc = (acc << 5) + b32rev[c]
except KeyError:
raise binascii.Error("Non-base32 digit found") from None
decoded += acc.to_bytes(5, "big")
if padchars:
acc <<= 5 * padchars
last = acc.to_bytes(5, "big")
if padchars == 1:
decoded[-5:] = last[:-1]
else:
if padchars == 3:
decoded[-5:] = last[:-2]
else:
if padchars == 4:
decoded[-5:] = last[:-3]
else:
if padchars == 6:
decoded[-5:] = last[:-4]
else:
raise binascii.Error("Incorrect padding")
return bytes(decoded)
def b16encode(s):
"""Encode the bytes-like object s using Base16 and return a bytes object.
"""
return binascii.hexlify(s).upper()
def b16decode(s, casefold=False):
"""Decode the Base16 encoded bytes-like object or ASCII string s.
Optional casefold is a flag specifying whether a lowercase alphabet is
acceptable as input. For security purposes, the default is False.
The result is returned as a bytes object. A binascii.Error is raised if
s is incorrectly padded or if there are non-alphabet characters present
in the input.
"""
s = _bytes_from_decode_data(s)
if casefold:
s = s.upper()
if re.search(b"[^0-9A-F]", s):
raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s)
_a85chars = None
_a85chars2 = None
_A85START = b"<~"
_A85END = b"~>"
def _85encode(b, chars, chars2, pad=False, foldnuls=False, foldspaces=False):
if not isinstance(b, bytes_types):
b = memoryview(b).tobytes()
padding = -len(b) % 4
if padding:
b = b + b"\x00" * padding
words = struct.Struct("!%dI" % (len(b) // 4)).unpack(b)
chunks = [
b"z"
if not word
else (
word == 538976288 and b"y"
if foldspaces
else chars2[word // 614125] + chars2[word // 85 % 7225] + chars[word % 85]
)
for word in words
if foldnuls
]
if padding:
if not pad:
if chunks[-1] == b"z":
chunks[-1] = chars[0] * 5
chunks[-1] = chunks[-1][:-padding]
return (b"").join(chunks)
def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False):
r"""Encode bytes-like object b using Ascii85 and return a bytes object.
foldspaces is an optional flag that uses the special short sequence 'y'
instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This
feature is not supported by the "standard" Adobe encoding.
wrapcol controls whether the output should have newline (b'\n') characters
added to it. If this is non-zero, each output line will be at most this
many characters long.
pad controls whether the input is padded to a multiple of 4 before
encoding. Note that the btoa implementation always pads.
adobe controls whether the encoded byte sequence is framed with <~ and ~>,
which is used by the Adobe implementation.
"""
global _a85chars
global _a85chars2
if _a85chars is None:
_a85chars = [bytes((i,)) for i in range(33, 118)]
_a85chars2 = [a + b for b in _a85chars]
result = _85encode(b, _a85chars, _a85chars2, pad, True, foldspaces)
if adobe:
result = _A85START + result
if wrapcol:
wrapcol = max(2 if adobe else 1, wrapcol)
chunks = [result[i : i + wrapcol] for i in range(0, len(result), wrapcol)]
if adobe:
if len(chunks[-1]) + 2 > wrapcol:
chunks.append(b"")
result = (b"\n").join(chunks)
if adobe:
result += _A85END
return result
def a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b" \t\n\r\x0b"):
"""Decode the Ascii85 encoded bytes-like object or ASCII string b.
foldspaces is a flag that specifies whether the 'y' short sequence should be
accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is
not supported by the "standard" Adobe encoding.
adobe controls whether the input sequence is in Adobe Ascii85 format (i.e.
is framed with <~ and ~>).
ignorechars should be a byte string containing characters to ignore from the
input. This should only contain whitespace characters, and by default
contains all whitespace characters in ASCII.
The result is returned as a bytes object.
"""
b = _bytes_from_decode_data(b)
if adobe:
if not b.endswith(_A85END):
raise ValueError(
("Ascii85 encoded byte sequences must end with {!r}").format(_A85END)
)
if b.startswith(_A85START):
b = b[2:-2]
else:
b = b[:-2]
packI = struct.Struct("!I").pack
decoded = []
decoded_append = decoded.append
curr = []
curr_append = curr.append
curr_clear = curr.clear
for x in b + b"uuuu":
if 33 <= x <= 117:
curr_append(x)
if len(curr) == 5:
acc = 0
for x in curr:
acc = 85 * acc + (x - 33)
try:
decoded_append(packI(acc))
except struct.error:
raise ValueError("Ascii85 overflow") from None
curr_clear()
elif x == 122:
if curr:
raise ValueError("z inside Ascii85 5-tuple")
decoded_append(b"\x00\x00\x00\x00")
elif foldspaces:
if x == 121:
if curr:
raise ValueError("y inside Ascii85 5-tuple")
decoded_append(b" ")
else:
if x in ignorechars:
pass
continue
else:
raise ValueError("Non-Ascii85 digit found: %c" % x)
result = (b"").join(decoded)
padding = 4 - len(curr)
if padding:
result = result[:-padding]
return result
_b85alphabet = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
_b85chars = None
_b85chars2 = None
_b85dec = None
def b85encode(b, pad=False):
r"""Encode bytes-like object b in base85 format and return a bytes object.
If pad is true, the input is padded with b'\0' so its length is a multiple of
4 bytes before encoding.
"""
global _b85chars
global _b85chars2
if _b85chars is None:
_b85chars = [bytes((i,)) for i in _b85alphabet]
_b85chars2 = [a + b for b in _b85chars]
return _85encode(b, _b85chars, _b85chars2, pad)
def b85decode(b):
"""Decode the base85-encoded bytes-like object or ASCII string b
The result is returned as a bytes object.
"""
global _b85dec
if _b85dec is None:
_b85dec = [None] * 256
for i, c in enumerate(_b85alphabet):
_b85dec[c] = i
b = _bytes_from_decode_data(b)
padding = -len(b) % 5
b = b + b"~" * padding
out = []
packI = struct.Struct("!I").pack
for i in range(0, len(b), 5):
chunk = b[i : i + 5]
acc = 0
try:
for c in chunk:
acc = acc * 85 + _b85dec[c]
except TypeError:
for j, c in enumerate(chunk):
if _b85dec[c] is None:
raise ValueError(
"bad base85 character at position %d" % (i + j)
) from None
raise
try:
out.append(packI(acc))
except struct.error:
raise ValueError(
"base85 overflow in hunk starting at byte %d" % i
) from None
result = (b"").join(out)
if padding:
result = result[:-padding]
return result
MAXLINESIZE = 76
MAXBINSIZE = MAXLINESIZE // 4 * 3
def encode(input, output):
"""Encode a file; input and output are binary files."""
while True:
s = input.read(MAXBINSIZE)
if not s:
break
while len(s) < MAXBINSIZE:
ns = input.read(MAXBINSIZE - len(s))
if not ns:
break
s += ns
line = binascii.b2a_base64(s)
output.write(line)
def decode(input, output):
"""Decode a file; input and output are binary files."""
while True:
line = input.readline()
if not line:
break
s = binascii.a2b_base64(line)
output.write(s)
def _input_type_check(s):
try:
m = memoryview(s)
except TypeError as err:
msg = "expected bytes-like object, not %s" % s.__class__.__name__
raise TypeError(msg) from err
if m.format not in ("c", "b", "B"):
msg = "expected single byte elements, not %r from %s" % (
m.format,
s.__class__.__name__,
)
raise TypeError(msg)
if m.ndim != 1:
msg = "expected 1-D data, not %d-D data from %s" % (
m.ndim,
s.__class__.__name__,
)
raise TypeError(msg)
def encodebytes(s):
"""Encode a bytestring into a bytes object containing multiple lines
of base-64 data."""
_input_type_check(s)
pieces = []
for i in range(0, len(s), MAXBINSIZE):
chunk = s[i : i + MAXBINSIZE]
pieces.append(binascii.b2a_base64(chunk))
return (b"").join(pieces)
def encodestring(s):
"""Legacy alias of encodebytes()."""
import warnings
warnings.warn(
"encodestring() is a deprecated alias since 3.1, use encodebytes()",
DeprecationWarning,
2,
)
return encodebytes(s)
def decodebytes(s):
"""Decode a bytestring of base-64 data into a bytes object."""
_input_type_check(s)
return binascii.a2b_base64(s)
def decodestring(s):
"""Legacy alias of decodebytes()."""
import warnings
warnings.warn(
"decodestring() is a deprecated alias since Python 3.1, use decodebytes()",
DeprecationWarning,
2,
)
return decodebytes(s)
def main():
"""Small main program"""
import sys, getopt
try:
opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg:
sys.stdout = sys.stderr
print(msg)
print(
"usage: %s [-d|-e|-u|-t] [file|-]\n -d, -u: decode\n -e: encode (default)\n -t: encode and decode string 'Aladdin:open sesame'"
% sys.argv[0]
)
sys.exit(2)
func = encode
for o, a in opts:
if o == "-e":
func = encode
if o == "-d":
func = decode
if o == "-u":
func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as (f):
func(f, sys.stdout.buffer)
else:
func(sys.stdin.buffer, sys.stdout.buffer)
def test():
s0 = b"Aladdin:open sesame"
print(repr(s0))
s1 = encodebytes(s0)
print(repr(s1))
s2 = decodebytes(s1)
print(repr(s2))
if not s0 == s2:
raise AssertionError
if __name__ == "__main__":
main()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。