summaryrefslogtreecommitdiffstats
path: root/Lib/base64.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2012-06-22 22:16:09 (GMT)
committerGuido van Rossum <guido@python.org>2012-06-22 22:16:09 (GMT)
commit95c1c48fd6841230c6e8600b604e8460010ab399 (patch)
treefccc279079c0a9c148e90d4971c63ddaba3c16dc /Lib/base64.py
parent9436361e4cdd7d3dc5f42674b54995c4915afb59 (diff)
downloadcpython-95c1c48fd6841230c6e8600b604e8460010ab399.zip
cpython-95c1c48fd6841230c6e8600b604e8460010ab399.tar.gz
cpython-95c1c48fd6841230c6e8600b604e8460010ab399.tar.bz2
Speed up base64.urlsafe_{en,de}code().
Diffstat (limited to 'Lib/base64.py')
-rwxr-xr-xLib/base64.py24
1 files changed, 11 insertions, 13 deletions
diff --git a/Lib/base64.py b/Lib/base64.py
index edcc4be..4042f00 100755
--- a/Lib/base64.py
+++ b/Lib/base64.py
@@ -40,14 +40,6 @@ def _bytes_from_decode_data(s):
else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__)
-def _translate(s, altchars):
- if not isinstance(s, bytes_types):
- raise TypeError("expected bytes, not %s" % s.__class__.__name__)
- translation = bytearray(range(256))
- for k, v in altchars.items():
- translation[ord(k)] = v[0]
- return s.translate(translation)
-
# Base64 encoding/decoding uses binascii
@@ -71,7 +63,7 @@ def b64encode(s, altchars=None):
raise TypeError("expected bytes, not %s"
% altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars)
- return _translate(encoded, {'+': altchars[0:1], '/': altchars[1:2]})
+ return encoded.translate(bytes.maketrans(b'+/', altchars))
return encoded
@@ -93,7 +85,7 @@ def b64decode(s, altchars=None, validate=False):
if altchars is not None:
altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars)
- s = _translate(s, {chr(altchars[0]): b'+', chr(altchars[1]): b'/'})
+ s = s.translate(bytes.maketrans(altchars, b'+/'))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s):
raise binascii.Error('Non-base64 digit found')
return binascii.a2b_base64(s)
@@ -116,6 +108,10 @@ def standard_b64decode(s):
"""
return b64decode(s)
+
+_urlsafe_encode_translation = bytes.maketrans(b'+/', b'-_')
+_urlsafe_decode_translation = bytes.maketrans(b'-_', b'+/')
+
def urlsafe_b64encode(s):
"""Encode a byte string using a url-safe Base64 alphabet.
@@ -123,7 +119,7 @@ def urlsafe_b64encode(s):
returned. The alphabet uses '-' instead of '+' and '_' instead of
'/'.
"""
- return b64encode(s, b'-_')
+ return b64encode(s).translate(_urlsafe_encode_translation)
def urlsafe_b64decode(s):
"""Decode a byte string encoded with the standard Base64 alphabet.
@@ -135,7 +131,9 @@ def urlsafe_b64decode(s):
The alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
- return b64decode(s, b'-_')
+ s = _bytes_from_decode_data(s)
+ s = s.translate(_urlsafe_decode_translation)
+ return b64decode(s)
@@ -228,7 +226,7 @@ def b32decode(s, casefold=False, map01=None):
if map01 is not None:
map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01)
- s = _translate(s, {b'0': b'O', b'1': map01})
+ s = s.translate(bytes.maketrans(b'01', b'O' + map01))
if casefold:
s = s.upper()
# Strip off pad characters from the right. We need to count the pad