108 lines
2.9 KiB
Java
108 lines
2.9 KiB
Java
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<Integer> readIntList() {
|
|
buffer.position(buffer.position() + 4); // vector code
|
|
final int size = buffer.getInt();
|
|
final List<Integer> 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<Long> readLongList() {
|
|
buffer.position(buffer.position() + 4); // vector code
|
|
final int size = buffer.getInt();
|
|
final List<Long> 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<byte[]> readBytesList() {
|
|
buffer.position(buffer.position() + 4); // vector code
|
|
final int size = buffer.getInt();
|
|
final List<byte[]> 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<String> readStringList() {
|
|
buffer.position(buffer.position() + 4); // vector code
|
|
final int size = buffer.getInt();
|
|
final List<String> 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<Object> result = new ArrayList<>(size);
|
|
for (int i = 0; i < size; ++i) {
|
|
result.add(readTl());
|
|
}
|
|
return result;
|
|
}
|
|
}
|