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 повторяются всего несколько байтов справа. Вот где я случайно разместил позицию буфера. Не волнуйся, мне стыдно.

Другие вопросы по тегам