You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2026/04/04 12:25:49 UTC

(commons-codec) 02/03: Internal refactoring

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-codec.git

commit c60d0ed1242339cd876d33bb5303ff9e21837d98
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Apr 4 07:56:37 2026 -0400

    Internal refactoring
---
 .../org/apache/commons/codec/binary/Base16.java    |  2 +-
 .../org/apache/commons/codec/binary/Base32.java    |  2 +-
 .../org/apache/commons/codec/binary/Base58.java    |  2 +-
 .../org/apache/commons/codec/binary/Base64.java    |  2 +-
 .../apache/commons/codec/binary/BaseNCodec.java    |  4 +++
 .../codec/binary/Base58OutputStreamTest.java       | 39 +++++++++++++++++++---
 6 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/apache/commons/codec/binary/Base16.java b/src/main/java/org/apache/commons/codec/binary/Base16.java
index fee4f6fc..cd4b8938 100644
--- a/src/main/java/org/apache/commons/codec/binary/Base16.java
+++ b/src/main/java/org/apache/commons/codec/binary/Base16.java
@@ -282,7 +282,7 @@ public class Base16 extends BaseNCodec {
      */
     @Override
     public boolean isInAlphabet(final byte octet) {
-        return (octet & 0xff) < decodeTable.length && decodeTable[octet] != -1;
+        return isInAlphabet((byte) (octet & 0xff), decodeTable);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/codec/binary/Base32.java b/src/main/java/org/apache/commons/codec/binary/Base32.java
index b986ebb6..1de64238 100644
--- a/src/main/java/org/apache/commons/codec/binary/Base32.java
+++ b/src/main/java/org/apache/commons/codec/binary/Base32.java
@@ -738,7 +738,7 @@ public class Base32 extends BaseNCodec {
      */
     @Override
     public boolean isInAlphabet(final byte octet) {
-        return octet >= 0 && octet < decodeTable.length && decodeTable[octet] != -1;
+        return isInAlphabet(octet, decodeTable);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/codec/binary/Base58.java b/src/main/java/org/apache/commons/codec/binary/Base58.java
index d029299b..78a8ca77 100644
--- a/src/main/java/org/apache/commons/codec/binary/Base58.java
+++ b/src/main/java/org/apache/commons/codec/binary/Base58.java
@@ -306,6 +306,6 @@ public class Base58 extends BaseNCodec {
      */
     @Override
     protected boolean isInAlphabet(final byte value) {
-        return value >= 0 && value < DECODE_TABLE.length && DECODE_TABLE[value] != -1;
+        return isInAlphabet(value, DECODE_TABLE);
     }
 }
diff --git a/src/main/java/org/apache/commons/codec/binary/Base64.java b/src/main/java/org/apache/commons/codec/binary/Base64.java
index 9a35e860..22941b42 100644
--- a/src/main/java/org/apache/commons/codec/binary/Base64.java
+++ b/src/main/java/org/apache/commons/codec/binary/Base64.java
@@ -1150,7 +1150,7 @@ public class Base64 extends BaseNCodec {
      */
     @Override
     protected boolean isInAlphabet(final byte octet) {
-        return octet >= 0 && octet < decodeTable.length && decodeTable[octet] != -1;
+        return isInAlphabet(octet, decodeTable);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/codec/binary/BaseNCodec.java b/src/main/java/org/apache/commons/codec/binary/BaseNCodec.java
index d6cd9c00..0b1acc01 100644
--- a/src/main/java/org/apache/commons/codec/binary/BaseNCodec.java
+++ b/src/main/java/org/apache/commons/codec/binary/BaseNCodec.java
@@ -450,6 +450,10 @@ public abstract class BaseNCodec implements BinaryEncoder, BinaryDecoder {
         return b;
     }
 
+    protected static boolean isInAlphabet(final byte value, final byte[] table) {
+        return value >= 0 && value < table.length && table[value] != -1;
+    }
+
     /**
      * Deprecated: Will be removed in 2.0.
      * <p>
diff --git a/src/test/java/org/apache/commons/codec/binary/Base58OutputStreamTest.java b/src/test/java/org/apache/commons/codec/binary/Base58OutputStreamTest.java
index 266f036a..70805b44 100644
--- a/src/test/java/org/apache/commons/codec/binary/Base58OutputStreamTest.java
+++ b/src/test/java/org/apache/commons/codec/binary/Base58OutputStreamTest.java
@@ -22,7 +22,9 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Arrays;
 
 import org.junit.jupiter.api.Test;
 
@@ -122,16 +124,18 @@ class Base58OutputStreamTest extends AbstractBaseNOutputStreamTest {
                 out.write(element);
             }
         }
-        byte[] output = byteOut.toByteArray();
-        assertArrayEquals(encoded, output, "Streaming byte-by-byte Base58 encode");
+        final byte[] output0 = byteOut.toByteArray();
+        assertArrayEquals(encoded, output0, "Streaming byte-by-byte Base58 encode");
         byteOut = new ByteArrayOutputStream();
         try (OutputStream out = Base58OutputStream.builder().setOutputStream(byteOut).setEncode(false).get()) {
             for (final byte element : encoded) {
                 out.write(element);
             }
         }
-        output = byteOut.toByteArray();
-        assertArrayEquals(decoded, output, "Streaming byte-by-byte Base58 decode");
+        final byte[] output1 = byteOut.toByteArray();
+        assertArrayEquals(decoded, output1,
+                () -> String.format("Streaming byte-by-byte Base58 decode, chunkSize=%d, separator=%s, encoded=%s, decoded=%s, output=%s", chunkSize,
+                        Arrays.toString(separator), Arrays.toString(encoded), Arrays.toString(decoded), Arrays.toString(output1)));
         byteOut = new ByteArrayOutputStream();
         try (OutputStream out = Base58OutputStream.builder().setOutputStream(byteOut).setEncode(false).get()) {
             for (final byte element : encoded) {
@@ -139,7 +143,7 @@ class Base58OutputStreamTest extends AbstractBaseNOutputStreamTest {
                 out.flush();
             }
         }
-        output = byteOut.toByteArray();
+        byte[] output = byteOut.toByteArray();
         assertArrayEquals(decoded, output, "Streaming byte-by-byte flush() Base58 decode");
         byteOut = new ByteArrayOutputStream();
         OutputStream out = byteOut;
@@ -155,6 +159,31 @@ class Base58OutputStreamTest extends AbstractBaseNOutputStreamTest {
         assertArrayEquals(decoded, output, "Streaming byte-by-byte Base58 wrap-wrap-wrap!");
     }
 
+    @Test
+    void testDecodeByte49() throws IOException {
+        // Version 1.21.1:
+        // AssertionFailedError: Streaming byte-by-byte Base58 decode, chunkSize=0, separator=[10], encoded=[49], decoded=[0], output=[0, 0] ==> array lengths
+        // differ, expected: <1> but was: <2>
+        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+        final byte[] decoded = new byte[] { 0 };
+        try (OutputStream out = Base58OutputStream.builder().setOutputStream(byteOut).setEncode(false).get()) {
+            for (final byte element : decoded) {
+                out.write(element);
+            }
+        }
+        final byte[] encoded = new byte[] { 49 };
+        assertArrayEquals(encoded, byteOut.toByteArray());
+        byteOut = new ByteArrayOutputStream();
+        try (OutputStream out = Base58OutputStream.builder().setOutputStream(byteOut).setEncode(false).get()) {
+            for (final byte element : encoded) {
+                out.write(element);
+            }
+        }
+        final byte[] output = byteOut.toByteArray();
+        assertArrayEquals(decoded, output, () -> String.format("Streaming byte-by-byte Base58 decode, encoded=%s, decoded=%s, output=%s",
+                Arrays.toString(encoded), Arrays.toString(decoded), Arrays.toString(output)));
+    }
+
     @Test
     void testWriteOutOfBounds() throws Exception {
         final byte[] buf = new byte[1024];