Есть ли способ получить прямое ByteBuffer
нулевое положение относительно другого, учитывая только два объекта ByteBuffer
, если известно, что это подпоследовательность другого буфера?Получить прямое положение среза ByteBuffer относительно исходного ByteBuffer
Я знаю, что это может быть сделано с помощью непрямого массива ценных ByteBuffer
используя arrayOffset()
метод следующим образом:
int getRelativeBufferOffset(ByteBuffer parentBuffer, ByteBuffer childBuffer)
{
return childBuffer.arrayOffset() - parentBuffer.arrayOffset();
}
void example()
{
ByteBuffer buffer1 = ByteBuffer.allocate(10000);
buffer1 .position(22);
ByteBuffer buffer2 = buffer1.slice();
buffer2.position(55);
ByteBuffer buffer3 = buffer2.slice();
// returns 22
getRelativeBufferOffset(buffer1, buffer2);
// returns 55
getRelativeBufferOffset(buffer2, buffer3);
// returns 77
getRelativeBufferOffset(buffer1, buffer3);
}
Я думаю, что нет ничего, что существует свободный для прямых буферов , Чтобы получить что-то подобное, лучшим вариантом, о котором я могу думать, является расширение ByteBuffer
, чтобы сохранить ссылку на буфер, из которого он был создан (родительский буфер), и нулевую позицию относительно нулевой позиции родителя, в которой он был создан.
EDIT: Раздражающе выглядит, что я не могу продлить ByteBuffer
, потому что ни один из его конструкторов не виден. Наверное, мне придется написать какой-то класс оболочки.
Решение отражения аккуратное, но и для безопасности я думаю, что я чтобы спуститься по маршруту обертки и инкапсулировать 'ByteBuffer' в класс RelativeByteBuffer. К сожалению, 'Buffer' не предоставляет методы' duplicate() 'и' slice() ', поэтому я не могу сделать что-то опрятное, как' RelativeBuffer '. –
PaddyD
Смещение предназначено для ведения журнала диагностики при непредвиденных данных в буфере - мне нужно знать смещение данных относительно другого буфера, из которого был создан буфер. – PaddyD
Я считаю, что для * исключительно * диагностических целей решение отражения должно быть прекрасным. Я не уверен, насколько далеко намерение выполнить такой анализ должно повлиять на то, как моделируются в первую очередь. Но в конце концов, решение зависит от вас. И, возможно, кто-то другой пишет и отвечает, что лучше соответствует вашим потребностям. – Marco13