package com.hypixel.hytale.protocol.io; import io.netty.buffer.ByteBuf; import javax.annotation.Nonnull; public final class VarInt { private VarInt() { } public static void write(@Nonnull ByteBuf buf, int value) { if (value < 0) { throw new IllegalArgumentException("VarInt cannot encode negative values: " + value); } else { while ((value & -128) != 0) { buf.writeByte(value & 127 | 128); value >>>= 7; } buf.writeByte(value); } } public static int read(@Nonnull ByteBuf buf) { int value = 0; int shift = 0; do { byte b = buf.readByte(); value |= (b & 127) << shift; if ((b & 128) == 0) { return value; } shift += 7; } while (shift <= 28); throw new ProtocolException("VarInt exceeds maximum length (5 bytes)"); } public static int peek(@Nonnull ByteBuf buf, int index) { int value = 0; int shift = 0; int pos = index; while (pos < buf.writerIndex()) { byte b = buf.getByte(pos++); value |= (b & 127) << shift; if ((b & 128) == 0) { return value; } shift += 7; if (shift > 28) { return -1; } } return -1; } public static int length(@Nonnull ByteBuf buf, int index) { int pos = index; while (pos < buf.writerIndex()) { if ((buf.getByte(pos++) & 128) == 0) { return pos - index; } if (pos - index > 5) { return -1; } } return -1; } public static int size(int value) { if ((value & -128) == 0) { return 1; } else if ((value & -16384) == 0) { return 2; } else if ((value & -2097152) == 0) { return 3; } else { return (value & -268435456) == 0 ? 4 : 5; } } }