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];