diff --git a/src/main/java/org/xerial/snappy/BitShuffle.java b/src/main/java/org/xerial/snappy/BitShuffle.java index b2a4a6fc..a3085cf2 100644 --- a/src/main/java/org/xerial/snappy/BitShuffle.java +++ b/src/main/java/org/xerial/snappy/BitShuffle.java @@ -199,7 +199,7 @@ public static int unshuffle(ByteBuffer shuffled, BitShuffleType type, ByteBuffer if (output.remaining() < uLen) { throw new IllegalArgumentException("not enough space for output"); } - int numProcessed = impl.unshuffleDirectBuffer(shuffled, uPos, typeSize, uLen, output, shuffled.position()); + int numProcessed = impl.unshuffleDirectBuffer(shuffled, uPos, typeSize, uLen, output, output.position()); assert(numProcessed == uLen); // pos limit diff --git a/src/test/java/org/xerial/snappy/BitShuffleTest.java b/src/test/java/org/xerial/snappy/BitShuffleTest.java index 8dfa6bec..f3036faa 100644 --- a/src/test/java/org/xerial/snappy/BitShuffleTest.java +++ b/src/test/java/org/xerial/snappy/BitShuffleTest.java @@ -268,6 +268,31 @@ public void shuffleDirectDoubleArray() assertEquals(Integer.MIN_VALUE, result.getDouble(), 0.0000001); } + @Test + public void unshuffleWritesAtOutputPosition() + throws Exception + { + ByteBuffer testData = ByteBuffer.allocateDirect(32); + for (int i = 0; i < 8; i++) { + testData.putInt(i * 1000 + 7); + } + testData.flip(); + ByteBuffer shuffled = ByteBuffer.allocateDirect(64); + shuffled.position(32); + BitShuffle.shuffle(testData, BitShuffleType.INT, shuffled); + assertEquals(32, shuffled.position()); + + ByteBuffer result = ByteBuffer.allocateDirect(64); + BitShuffle.unshuffle(shuffled, BitShuffleType.INT, result); + assertEquals(0, result.position()); + for (int i = 0; i < 8; i++) { + assertEquals(i * 1000 + 7, result.getInt()); + } + for (int i = 32; i < 64; i++) { + assertEquals(0, result.get(i)); + } + } + @Test public void shuffleLongArray() throws Exception