Conversion.hexTo*() methods now throw IllegalArgumentException instead
of StringIndexOutOfBoundsException
Better exception messages
diff --git a/src/main/java/org/apache/commons/lang3/Conversion.java b/src/main/java/org/apache/commons/lang3/Conversion.java
index b8f805d..feec252 100644
--- a/src/main/java/org/apache/commons/lang3/Conversion.java
+++ b/src/main/java/org/apache/commons/lang3/Conversion.java
@@ -793,8 +793,9 @@ public static byte hexToByte(final String src, final int srcPos, final byte dstI
if ((nHex - 1) * 4 + dstPos >= 8) {
throw new IllegalArgumentException("(nHex - 1) * 4 + dstPos is greater than or equal to 8");
}
- if (srcPos + nHex > src.length()) {
- throw new IllegalArgumentException(String.format("srcPos %,d, + nHex %,d > src.length()", srcPos, nHex, src.length()));
+ if (srcPos < 0 || nHex < 0 || srcPos > src.length() - nHex) {
+ throw new IllegalArgumentException(
+ String.format("srcPos %,d, dstInit %,d, dstPos %,d, nHex %,d, src.length() %,d", srcPos, dstInit, dstPos, nHex, src.length()));
}
byte out = dstInit;
for (int i = 0; i < nHex; i++) {
diff --git a/src/test/java/org/apache/commons/lang3/ConversionTest.java b/src/test/java/org/apache/commons/lang3/ConversionTest.java
index 23c5e5d..75d6a34 100644
--- a/src/test/java/org/apache/commons/lang3/ConversionTest.java
+++ b/src/test/java/org/apache/commons/lang3/ConversionTest.java
@@ -709,6 +709,8 @@ void testHexToByte() {
assertEquals((byte) 0x34, Conversion.hexToByte(src, 0, (byte) 0x34, 0, 0));
assertEquals((byte) 0x84, Conversion.hexToByte(src, 17, (byte) 0x34, 4, 1));
assertThrows(IllegalArgumentException.class, () -> Conversion.hexToByte(src, src.length(), (byte) 0, 0, 1));
+ assertThrows(IllegalArgumentException.class, () -> Conversion.hexToByte(src, Integer.MIN_VALUE, (byte) 0, 0, 1));
+ assertThrows(IllegalArgumentException.class, () -> Conversion.hexToByte(src, Integer.MAX_VALUE, (byte) 0, 0, 1));
}
/**