diff --git a/Lib/base64.py b/Lib/base64.py --- a/Lib/base64.py +++ b/Lib/base64.py @@ -27,7 +27,7 @@ ] -bytes_types = (bytes, bytearray) # Types acceptable as binary data +bytes_types = (bytes, bytearray, memoryview) # Types acceptable as binary data def _bytes_from_decode_data(s): if isinstance(s, str): @@ -161,6 +161,8 @@ """ if not isinstance(s, bytes_types): raise TypeError("expected bytes, not %s" % s.__class__.__name__) + if isinstance(s, memoryview): + s = s.tobytes() quanta, leftover = divmod(len(s), 5) # Pad the last quantum with zero bits if necessary if leftover: diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -15,6 +15,8 @@ eq(base64.encodebytes(b"a"), b"YQ==\n") eq(base64.encodebytes(b"ab"), b"YWI=\n") eq(base64.encodebytes(b"abc"), b"YWJj\n") + # Test for memoryview, issue17839 + eq(base64.encodebytes(memoryview(b"abc")), b"YWJj\n") eq(base64.encodebytes(b""), b"") eq(base64.encodebytes(b"abcdefghijklmnopqrstuvwxyz" b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -69,6 +71,8 @@ eq(base64.b64encode(b"a"), b"YQ==") eq(base64.b64encode(b"ab"), b"YWI=") eq(base64.b64encode(b"abc"), b"YWJj") + # Test for memoryview, issue17839 + eq(base64.b64encode(memoryview(b"abc")), b"YWJj") eq(base64.b64encode(b""), b"") eq(base64.b64encode(b"abcdefghijklmnopqrstuvwxyz" b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -86,6 +90,8 @@ eq(base64.standard_b64encode(b"a"), b"YQ==") eq(base64.standard_b64encode(b"ab"), b"YWI=") eq(base64.standard_b64encode(b"abc"), b"YWJj") + # Test for memoryview, issue17839 + eq(base64.standard_b64encode(memoryview(b"abc")), b"YWJj") eq(base64.standard_b64encode(b""), b"") eq(base64.standard_b64encode(b"abcdefghijklmnopqrstuvwxyz" b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -180,6 +186,8 @@ eq(base64.b32encode(b'abcd'), b'MFRGGZA=') eq(base64.b32encode(b'abcde'), b'MFRGGZDF') self.assertRaises(TypeError, base64.b32encode, "") + # Test for memoryview, issue17839 + eq(base64.b32encode(memoryview(b'abcde')), b'MFRGGZDF') def test_b32decode(self): eq = self.assertEqual @@ -246,6 +254,8 @@ eq(base64.b16encode(b'\x01\x02\xab\xcd\xef'), b'0102ABCDEF') eq(base64.b16encode(b'\x00'), b'00') self.assertRaises(TypeError, base64.b16encode, "") + # Test for memoryview, issue17839 + eq(base64.b16encode(memoryview(b'\x01\x02\xab\xcd\xef')), b'0102ABCDEF') def test_b16decode(self): eq = self.assertEqual