]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-143103: Added pad parameter to base64.z85encode() (GH-143106)
authorHauke D <haukex@zero-g.net>
Thu, 25 Dec 2025 11:34:44 +0000 (12:34 +0100)
committerGitHub <noreply@github.com>
Thu, 25 Dec 2025 11:34:44 +0000 (13:34 +0200)
This makes it analogous to a85encode() and b85encode() and allows the
user to more easily meet the Z85 specification, which requires input
lengths to be a multiple of 4.

Doc/library/base64.rst
Lib/base64.py
Lib/test/test_base64.py
Misc/ACKS
Misc/NEWS.d/next/Library/2025-12-23-17-07-22.gh-issue-143103.LRjXEW.rst [new file with mode: 0644]

index 529a72424438203d5dac8da9b8b0e3b5fd9f60de..2d901824335145d14b2e6fce97848064a5c293c1 100644 (file)
@@ -267,14 +267,20 @@ Refer to the documentation of the individual functions for more information.
    .. versionadded:: 3.4
 
 
-.. function:: z85encode(s)
+.. function:: z85encode(s, pad=False)
 
    Encode the :term:`bytes-like object` *s* using Z85 (as used in ZeroMQ)
    and return the encoded :class:`bytes`.  See `Z85  specification
    <https://rfc.zeromq.org/spec/32/>`_ for more information.
 
+   If *pad* is true, the input is padded with ``b'\0'`` so its length is a
+   multiple of 4 bytes before encoding.
+
    .. versionadded:: 3.13
 
+   .. versionchanged:: next
+      The *pad* parameter was added.
+
 
 .. function:: z85decode(s)
 
index 341bf8eaf1891e8ef352e6bb407a1188287d9c22..c2fdee8eab96903cd10cb2855d334b43edafc4c7 100644 (file)
@@ -508,9 +508,9 @@ _z85_decode_translation = bytes.maketrans(
 )
 _z85_encode_translation = bytes.maketrans(_b85alphabet, _z85alphabet)
 
-def z85encode(s):
+def z85encode(s, pad=False):
     """Encode bytes-like object b in z85 format and return a bytes object."""
-    return b85encode(s).translate(_z85_encode_translation)
+    return b85encode(s, pad).translate(_z85_encode_translation)
 
 def z85decode(s):
     """Decode the z85-encoded bytes-like object or ASCII string b
index ac3f09405457df6d286fa918d80017526b50852f..288caf663e8321b00e5782cc19bf044b8a6210d8 100644 (file)
@@ -665,6 +665,7 @@ class BaseXYTestCase(unittest.TestCase):
 
         tests = {
             b'': b'',
+            b'\x86\x4F\xD2\x6F\xB5\x59\xF7\x5B': b'HelloWorld',
             b'www.python.org': b'CxXl-AcVLsz/dgCA+t',
             bytes(range(255)): b"""009c61o!#m2NH?C3>iWS5d]J*6CRx17-skh9337x"""
                 b"""ar.{NbQB=+c[cR@eg&FcfFLssg=mfIi5%2YjuU>)kTv.7l}6Nnnj=AD"""
@@ -840,6 +841,21 @@ class BaseXYTestCase(unittest.TestCase):
         eq(base64.b85decode(b'czAet'), b"xxxx")
         eq(base64.b85decode(b'czAetcmMzZ'), b"xxxxx\x00\x00\x00")
 
+    def test_z85_padding(self):
+        eq = self.assertEqual
+
+        eq(base64.z85encode(b"x", pad=True), b'CMmZz')
+        eq(base64.z85encode(b"xx", pad=True), b'CZ6h*')
+        eq(base64.z85encode(b"xxx", pad=True), b'CZaDk')
+        eq(base64.z85encode(b"xxxx", pad=True), b'CZaET')
+        eq(base64.z85encode(b"xxxxx", pad=True), b'CZaETCMmZz')
+
+        eq(base64.z85decode(b'CMmZz'), b"x\x00\x00\x00")
+        eq(base64.z85decode(b'CZ6h*'), b"xx\x00\x00")
+        eq(base64.z85decode(b'CZaDk'), b"xxx\x00")
+        eq(base64.z85decode(b'CZaET'), b"xxxx")
+        eq(base64.z85decode(b'CZaETCMmZz'), b"xxxxx\x00\x00\x00")
+
     def test_a85decode_errors(self):
         illegal = (set(range(32)) | set(range(118, 256))) - set(b' \t\n\r\v')
         for c in illegal:
index a14089a39cce82b1998230676dcc847afd7f30ca..bb6b6bde822a4e3f667fc0aa52975e904b1a0688 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -418,6 +418,7 @@ Lisandro Dalcin
 Darren Dale
 Andrew Dalke
 Lars Damerow
+Hauke Dämpfling
 Evan Dandrea
 Eric Daniel
 Scott David Daniels
diff --git a/Misc/NEWS.d/next/Library/2025-12-23-17-07-22.gh-issue-143103.LRjXEW.rst b/Misc/NEWS.d/next/Library/2025-12-23-17-07-22.gh-issue-143103.LRjXEW.rst
new file mode 100644 (file)
index 0000000..b00c037
--- /dev/null
@@ -0,0 +1 @@
+Add padding support to :func:`base64.z85encode` via the ``pad`` parameter.