63 lines
1.9 KiB
Java
63 lines
1.9 KiB
Java
package com.destroystokyo.paper.antixray;
|
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
public class DataBitsReader {
|
|
|
|
private ByteBuf dataBits; // Akarin
|
|
private int bitsPerValue;
|
|
private int mask;
|
|
private int longInDataBitsIndex;
|
|
private int bitInLongIndex;
|
|
private long current;
|
|
|
|
public void setDataBits(ByteBuf dataBits) { // Akarin
|
|
this.dataBits = dataBits;
|
|
}
|
|
|
|
public void setBitsPerValue(int bitsPerValue) {
|
|
this.bitsPerValue = bitsPerValue;
|
|
mask = (1 << bitsPerValue) - 1;
|
|
}
|
|
|
|
public void setIndex(int index) {
|
|
this.longInDataBitsIndex = index;
|
|
bitInLongIndex = 0;
|
|
init();
|
|
}
|
|
|
|
private void init() {
|
|
if (dataBits.capacity() > longInDataBitsIndex + 7) { // Akarin
|
|
// Akarin start
|
|
dataBits.getLong(longInDataBitsIndex);
|
|
/*
|
|
current = ((((long) dataBits[longInDataBitsIndex]) << 56)
|
|
| (((long) dataBits[longInDataBitsIndex + 1] & 0xff) << 48)
|
|
| (((long) dataBits[longInDataBitsIndex + 2] & 0xff) << 40)
|
|
| (((long) dataBits[longInDataBitsIndex + 3] & 0xff) << 32)
|
|
| (((long) dataBits[longInDataBitsIndex + 4] & 0xff) << 24)
|
|
| (((long) dataBits[longInDataBitsIndex + 5] & 0xff) << 16)
|
|
| (((long) dataBits[longInDataBitsIndex + 6] & 0xff) << 8)
|
|
| (((long) dataBits[longInDataBitsIndex + 7] & 0xff)));
|
|
*/ // Akarin end
|
|
}
|
|
}
|
|
|
|
public int read() {
|
|
int value = (int) (current >>> bitInLongIndex) & mask;
|
|
bitInLongIndex += bitsPerValue;
|
|
|
|
if (bitInLongIndex > 63) {
|
|
bitInLongIndex -= 64;
|
|
longInDataBitsIndex += 8;
|
|
init();
|
|
|
|
if (bitInLongIndex > 0) {
|
|
value |= current << bitsPerValue - bitInLongIndex & mask;
|
|
}
|
|
}
|
|
|
|
return value;
|
|
}
|
|
}
|