/** @see #readSignedNumIncreasing() */ public void writeSignedNumIncreasing(long val) { long x = val < 0 ? ~val : val; if (x < 64) { // Fast path for encoding length == 1. byte[] encodedArray = new byte[] {(byte) (LENGTH_TO_HEADER_BITS[1][0] ^ val)}; encodedArrays.add(encodedArray); return; } // buf = val in network byte order, sign extended to 10 bytes. byte signByte = val < 0 ? (byte) 0xff : 0; byte[] buf = new byte[2 + Longs.BYTES]; buf[0] = buf[1] = signByte; System.arraycopy(Longs.toByteArray(val), 0, buf, 2, Longs.BYTES); int len = getSignedEncodingLength(x); if (len < 2) { throw new IllegalStateException( "Invalid length (" + len + ")" + " returned by getSignedEncodingLength(" + x + ")"); } int beginIndex = buf.length - len; buf[beginIndex] ^= LENGTH_TO_HEADER_BITS[len][0]; buf[beginIndex + 1] ^= LENGTH_TO_HEADER_BITS[len][1]; byte[] encodedArray = new byte[len]; System.arraycopy(buf, beginIndex, encodedArray, 0, len); encodedArrays.add(encodedArray); }
if (len != getSignedEncodingLength(x)) { throw new IllegalArgumentException("Invalid encoded byte array");
@Test public void testGetSignedEncodingLength() { OrderedCode orderedCode = new OrderedCode(); assertEquals(10, orderedCode.getSignedEncodingLength(Long.MIN_VALUE)); assertEquals(10, orderedCode.getSignedEncodingLength(~(1L << 62))); assertEquals(9, orderedCode.getSignedEncodingLength(~(1L << 62) + 1)); assertEquals(3, orderedCode.getSignedEncodingLength(-8193)); assertEquals(2, orderedCode.getSignedEncodingLength(-8192)); assertEquals(2, orderedCode.getSignedEncodingLength(-65)); assertEquals(1, orderedCode.getSignedEncodingLength(-64)); assertEquals(1, orderedCode.getSignedEncodingLength(-2)); assertEquals(1, orderedCode.getSignedEncodingLength(-1)); assertEquals(1, orderedCode.getSignedEncodingLength(0)); assertEquals(1, orderedCode.getSignedEncodingLength(1)); assertEquals(1, orderedCode.getSignedEncodingLength(63)); assertEquals(2, orderedCode.getSignedEncodingLength(64)); assertEquals(2, orderedCode.getSignedEncodingLength(8191)); assertEquals(3, orderedCode.getSignedEncodingLength(8192)); assertEquals(9, orderedCode.getSignedEncodingLength((1L << 62)) - 1); assertEquals(10, orderedCode.getSignedEncodingLength(1L << 62)); assertEquals(10, orderedCode.getSignedEncodingLength(Long.MAX_VALUE)); }