package io.github.lonamiwebs.overgram.utils; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class BinaryReader { private final ByteBuffer buffer; public BinaryReader(final ByteBuffer buffer) { this.buffer = buffer; } public int readInt() { return buffer.getInt(); } public List readIntList() { buffer.position(buffer.position() + 4); // vector code final int size = buffer.getInt(); final List result = new ArrayList<>(size); for (int i = 0; i < size; ++i) { result.add(buffer.getInt()); } return result; } public long readLong() { return buffer.getLong(); } public List readLongList() { buffer.position(buffer.position() + 4); // vector code final int size = buffer.getInt(); final List result = new ArrayList<>(size); for (int i = 0; i < size; ++i) { result.add(buffer.getLong()); } return result; } public double readDouble() { return buffer.getDouble(); } public boolean readBoolean() { return buffer.getInt() == 0x997275b5; } public byte[] readBytes() { int length; int padding; final byte first = buffer.get(); if (first == (byte) 0xfe) { buffer.position(buffer.position() - 1); length = buffer.getInt() >> 8; padding = length % 4; } else { length = first; padding = (length + 1) % 4; } final byte[] data = new byte[length]; buffer.get(data); buffer.position(buffer.position() + padding); return data; } public List readBytesList() { buffer.position(buffer.position() + 4); // vector code final int size = buffer.getInt(); final List result = new ArrayList<>(size); for (int i = 0; i < size; ++i) { result.add(readBytes()); } return result; } public String readString() { return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(readBytes())).toString(); } public List readStringList() { buffer.position(buffer.position() + 4); // vector code final int size = buffer.getInt(); final List result = new ArrayList<>(size); for (int i = 0; i < size; ++i) { result.add(readString()); } return result; } public Object readTl() { return null; } public List readTlList() { buffer.position(buffer.position() + 4); // vector code final int size = buffer.getInt(); final List result = new ArrayList<>(size); for (int i = 0; i < size; ++i) { result.add(readTl()); } return result; } }