Не используйте Reader
s ни для чего, кроме символьных данных!
Используйте DataInput
для чтения целых чисел. Украсьте свой GZIPInputStream
DataInputStream
и используйте readInt
.
Если целые числа имеют младший порядок, вам необходимо изменить порядок байтов для типа. Java использует сетевой порядок байтов (big-endian). Для целых чисел это можно сделать с помощью Integer.reverseBytes .
Вы можете распечатать шестнадцатеричные значения, используя:
System.out.format("%08x", (int) n);
Как прочитать все int
значения из потока произвольной длины:
Одним из механизмов будет использование метода available()
, который оценивает количество оставшихся байтов:
byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
(byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
DataInputStream data = new DataInputStream(array);
while(data.available() > 0) {
int reversed = Integer.reverseBytes(data.readInt());
System.out.format("%08x%n", reversed);
}
В общем случае available()
не является надежным механизмом. Но вы можете увеличить поток с помощью буфера для проверки доступности данных:
public static void main(String[] args) throws IOException {
byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
(byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
BufferedInputStream buffer = new BufferedInputStream(array);
DataInputStream data = new DataInputStream(buffer);
while(hasData(data)) {
int reversed = Integer.reverseBytes(data.readInt());
System.out.format("%08x%n", reversed);
}
}
public static boolean hasData(InputStream in) throws IOException {
in.mark(1);
try {
return in.read() != -1;
} finally {
in.reset();
}
}