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;
 | |
| 	}
 | |
| }
 |