50 lines
1 KiB
Java
50 lines
1 KiB
Java
package net.minecraft.network;
|
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
public class VarLong {
|
|
private static final int MAX_VARLONG_SIZE = 10;
|
|
private static final int DATA_BITS_MASK = 127;
|
|
private static final int CONTINUATION_BIT_MASK = 128;
|
|
private static final int DATA_BITS_PER_BYTE = 7;
|
|
|
|
public static int getByteSize(long data) {
|
|
for (int i = 1; i < 10; i++) {
|
|
if ((data & -1L << i * 7) == 0L) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return 10;
|
|
}
|
|
|
|
public static boolean hasContinuationBit(byte data) {
|
|
return (data & 128) == 128;
|
|
}
|
|
|
|
public static long read(ByteBuf buffer) {
|
|
long l = 0L;
|
|
int i = 0;
|
|
|
|
byte b;
|
|
do {
|
|
b = buffer.readByte();
|
|
l |= (long)(b & 127) << i++ * 7;
|
|
if (i > 10) {
|
|
throw new RuntimeException("VarLong too big");
|
|
}
|
|
} while (hasContinuationBit(b));
|
|
|
|
return l;
|
|
}
|
|
|
|
public static ByteBuf write(ByteBuf buffer, long value) {
|
|
while ((value & -128L) != 0L) {
|
|
buffer.writeByte((int)(value & 127L) | 128);
|
|
value >>>= 7;
|
|
}
|
|
|
|
buffer.writeByte((int)value);
|
|
return buffer;
|
|
}
|
|
}
|