MappedbyteBuffer.get() увеличивает позицию слишком сильно
Соответствующая часть моего файла такова:
82 0a 96 c9 82 0a 96 d3 00 66 13 08
Я открываю файл в mappedbytebuffer и устанавливаю позицию в начало. Тогда я делаю это:
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
...
buffer.position(packetInfos.get(idPacket).getStartPos());
//getting the time from the packet header
time = Math.addExact(Math.multiplyExact((long) buffer.order(ByteOrder.LITTLE_ENDIAN).getInt(), 1000), Math.floorDiv(buffer.order(ByteOrder.LITTLE_ENDIAN).getInt(), 1000));
//getting the source ip from the ip frame
buffer.position(packetInfos.get(idPacket).getStartPos() + PACKET_IPSOURCE_OFFS); // puts the buffers position at the part of the file shown above
source = byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get());
//getting the destination ip from the ip frame
destination = byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get());
Метод byteToUnsigned просто делает:
public static int byteToUnsigned(byte b){
return b & 0xFF;
}
источник заканчивается: "130.10.150.211", когда оно должно быть "130.10.150.201". По какой-то причине метод get () увеличивает позицию буфера на 1 в большинстве случаев, но на 5 после третьего раза? Как вы уже догадались, я пытаюсь декодировать IP-адрес назначения позже, и он начинает читать после "D3", что приводит к "0.102.19.8"
Еще до вызова byteToUnsigned Ip источника имеет значение "-126.10.-106.-45".
После отладки, шаг за шагом через эту строку:
source = byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get()) + "." + byteToUnsigned(buffer.get());
Наблюдая за buffer.position () и buffer.get (), я мог видеть следующее:
- first get (): buffer.position () = 70, buffer.get () = - 126
- второй get(): buffer.position()=71, buffer.get()=10
- третий get(): buffer.position()=72, buffer.get()=-106
- четвертый get (): buffer.position () =73, buffer.get () = - 45
Таким образом, позиция увеличивается правильно, но байты между 72-м и 77-м не видны как-либо в буфере?
Api прямо заявляет:
public abstract byte get()
Relative get method. Reads the byte at this buffer's current position, and then increments the position.
Что мне не хватает?
1 ответ
Оказывается, я огромный идиот. Я не заметил, как байты 82 0a 96 повторяются всего несколько байтов справа. Вот где я случайно разместил позицию буфера. Не волнуйся, мне стыдно.