@Test public void testDecodeCopyWith1ByteOffset() throws Exception { ByteBuf in = Unpooled.wrappedBuffer(new byte[] { 0x0a, 0x04 << 2, 0x6e, 0x65, 0x74, 0x74, 0x79, 0x01 << 2 | 0x01, 0x05 }); ByteBuf out = Unpooled.buffer(10); snappy.decode(in, out); ByteBuf expected = Unpooled.wrappedBuffer(new byte[] { 0x6e, 0x65, 0x74, 0x74, 0x79, 0x6e, 0x65, 0x74, 0x74, 0x79 }); assertEquals("Copy was not decoded correctly", expected, out); in.release(); out.release(); expected.release(); }
private static int decodeCopyWith1ByteOffset(byte tag, ByteBuf in, ByteBuf out, int writtenSoFar) { if (!in.isReadable()) { return NOT_ENOUGH_INPUT; } int initialIndex = out.writerIndex(); int length = 4 + ((tag & 0x01c) >> 2); int offset = (tag & 0x0e0) << 8 >> 5 | in.readUnsignedByte(); validateOffset(offset, writtenSoFar); out.markReaderIndex(); if (offset < length) { int copies = length / offset; for (; copies > 0; copies--) { out.readerIndex(initialIndex - offset); out.readBytes(out, offset); } if (length % offset != 0) { out.readerIndex(initialIndex - offset); out.readBytes(out, length % offset); } } else { out.readerIndex(initialIndex - offset); out.readBytes(out, length); } out.resetReaderIndex(); return length; }
Snappy { private static int decodeCopyWith1ByteOffset(byte tag, ByteBuf in, ByteBuf out, int writtenSoFar) { if (!in.isReadable()) { return NOT_ENOUGH_INPUT; } int initialIndex = out.writerIndex(); int length = 4 + ((tag & 0x01c) >> 2); int offset = (tag & 0x0e0) << 8 >> 5 | in.readUnsignedByte(); validateOffset(offset, writtenSoFar); out.markReaderIndex(); if (offset < length) { int copies = length / offset; for (; copies > 0; copies--) { out.readerIndex(initialIndex - offset); out.readBytes(out, offset); } if (length % offset != 0) { out.readerIndex(initialIndex - offset); out.readBytes(out, length % offset); } } else { out.readerIndex(initialIndex - offset); out.readBytes(out, length); } out.resetReaderIndex(); return length; } }
Snappy { private static int decodeCopyWith1ByteOffset(byte tag, ByteBuf in, ByteBuf out, int writtenSoFar) { if (!in.isReadable()) { return NOT_ENOUGH_INPUT; } int initialIndex = out.writerIndex(); int length = 4 + ((tag & 0x01c) >> 2); int offset = (tag & 0x0e0) << 8 >> 5 | in.readUnsignedByte(); validateOffset(offset, writtenSoFar); out.markReaderIndex(); if (offset < length) { int copies = length / offset; for (; copies > 0; copies--) { out.readerIndex(initialIndex - offset); out.readBytes(out, offset); } if (length % offset != 0) { out.readerIndex(initialIndex - offset); out.readBytes(out, length % offset); } } else { out.readerIndex(initialIndex - offset); out.readBytes(out, length); } out.resetReaderIndex(); return length; }  }
Snappy { private static int decodeCopyWith1ByteOffset(byte tag, ByteBuf in, ByteBuf out, int writtenSoFar) { if (!in.isReadable()) { return NOT_ENOUGH_INPUT; } int initialIndex = out.writerIndex(); int length = 4 + ((tag & 0x01c) >> 2); int offset = (tag & 0x0e0) << 8 >> 5 | in.readUnsignedByte(); validateOffset(offset, writtenSoFar); out.markReaderIndex(); if (offset < length) { int copies = length / offset; for (; copies > 0; copies--) { out.readerIndex(initialIndex - offset); out.readBytes(out, offset); } if (length % offset != 0) { out.readerIndex(initialIndex - offset); out.readBytes(out, length % offset); } } else { out.readerIndex(initialIndex - offset); out.readBytes(out, length); } out.resetReaderIndex(); return length; }  void reset(); void encode(final ByteBuf in, final ByteBuf out, final int length); void decode(ByteBuf in, ByteBuf out); }
Snappy { private static int decodeCopyWith1ByteOffset(byte tag, ByteBuf in, ByteBuf out, int writtenSoFar) { if (!in.isReadable()) { return NOT_ENOUGH_INPUT; } int initialIndex = out.writerIndex(); int length = 4 + ((tag & 0x01c) >> 2); int offset = (tag & 0x0e0) << 8 >> 5 | in.readUnsignedByte(); validateOffset(offset, writtenSoFar); out.markReaderIndex(); if (offset < length) { int copies = length / offset; for (; copies > 0; copies--) { out.readerIndex(initialIndex - offset); out.readBytes(out, offset); } if (length % offset != 0) { out.readerIndex(initialIndex - offset); out.readBytes(out, length % offset); } } else { out.readerIndex(initialIndex - offset); out.readBytes(out, length); } out.resetReaderIndex(); return length; }  void reset(); void encode(final ByteBuf in, final ByteBuf out, final int length); void decode(ByteBuf in, ByteBuf out);  }