@Test void testReadingLargeLongThrows() { ByteBuffer bb = ByteBuffer.allocate(8); bb.putLong(Long.MAX_VALUE); bb.rewind(); assertThrows(ArithmeticException.class, () -> Utils.readBytesAsUnsignedInt(bb, 8)); }
public static int readBytesAsUnsignedInt(ByteBuffer buffer, int length) { switch (length) { case 1: return Byte.toUnsignedInt(buffer.get()); case 2: return Short.toUnsignedInt(buffer.getShort()); case 3: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 4: int value = buffer.getInt(); if (value < 0) { throw new ArithmeticException("Could not convert to unsigned"); } return value; case 5: case 6: case 7: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 8: return Math.toIntExact(buffer.getLong()); default: throw new IllegalArgumentException("Couldn't read " + length + " bytes as int"); } }
Utils { public static int readBytesAsUnsignedInt(ByteBuffer buffer, int length) { switch (length) { case 1: return Byte.toUnsignedInt(buffer.get()); case 2: return Short.toUnsignedInt(buffer.getShort()); case 3: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 4: int value = buffer.getInt(); if (value < 0) { throw new ArithmeticException("Could not convert to unsigned"); } return value; case 5: case 6: case 7: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 8: return Math.toIntExact(buffer.getLong()); default: throw new IllegalArgumentException("Couldn't read " + length + " bytes as int"); } } }
Utils { public static int readBytesAsUnsignedInt(ByteBuffer buffer, int length) { switch (length) { case 1: return Byte.toUnsignedInt(buffer.get()); case 2: return Short.toUnsignedInt(buffer.getShort()); case 3: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 4: int value = buffer.getInt(); if (value < 0) { throw new ArithmeticException("Could not convert to unsigned"); } return value; case 5: case 6: case 7: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 8: return Math.toIntExact(buffer.getLong()); default: throw new IllegalArgumentException("Couldn't read " + length + " bytes as int"); } } private  Utils(); }
Utils { public static int readBytesAsUnsignedInt(ByteBuffer buffer, int length) { switch (length) { case 1: return Byte.toUnsignedInt(buffer.get()); case 2: return Short.toUnsignedInt(buffer.getShort()); case 3: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 4: int value = buffer.getInt(); if (value < 0) { throw new ArithmeticException("Could not convert to unsigned"); } return value; case 5: case 6: case 7: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 8: return Math.toIntExact(buffer.getLong()); default: throw new IllegalArgumentException("Couldn't read " + length + " bytes as int"); } } private  Utils(); static String toHex(long address); static String readUntilNull(ByteBuffer buffer); static boolean validateName(String name); static void seekBufferToNextMultipleOfEight(ByteBuffer bb); static int readBytesAsUnsignedInt(ByteBuffer buffer, int length); static long readBytesAsUnsignedLong(ByteBuffer buffer, int length); static ByteBuffer createSubBuffer(ByteBuffer source, int length); static int bitsToInt(BitSet bits, int start, int length); static int bytesNeededToHoldNumber(long number); static int[] linearIndexToDimensionIndex(int index, int[] dimensions); static int dimensionIndexToLinearIndex(int[] index, int[] dimensions); static int[] chunkIndexToChunkOffset(int chunkIndex, int[] chunkDimensions, int[] datasetDimensions); static int[] stripLeadingIndex(int[] dims); }
Utils { public static int readBytesAsUnsignedInt(ByteBuffer buffer, int length) { switch (length) { case 1: return Byte.toUnsignedInt(buffer.get()); case 2: return Short.toUnsignedInt(buffer.getShort()); case 3: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 4: int value = buffer.getInt(); if (value < 0) { throw new ArithmeticException("Could not convert to unsigned"); } return value; case 5: case 6: case 7: return readArbitraryLengthBytesAsUnsignedInt(buffer, length); case 8: return Math.toIntExact(buffer.getLong()); default: throw new IllegalArgumentException("Couldn't read " + length + " bytes as int"); } } private  Utils(); static String toHex(long address); static String readUntilNull(ByteBuffer buffer); static boolean validateName(String name); static void seekBufferToNextMultipleOfEight(ByteBuffer bb); static int readBytesAsUnsignedInt(ByteBuffer buffer, int length); static long readBytesAsUnsignedLong(ByteBuffer buffer, int length); static ByteBuffer createSubBuffer(ByteBuffer source, int length); static int bitsToInt(BitSet bits, int start, int length); static int bytesNeededToHoldNumber(long number); static int[] linearIndexToDimensionIndex(int index, int[] dimensions); static int dimensionIndexToLinearIndex(int[] index, int[] dimensions); static int[] chunkIndexToChunkOffset(int chunkIndex, int[] chunkDimensions, int[] datasetDimensions); static int[] stripLeadingIndex(int[] dims);  }