ByteBuffer вызывает исключение потери памяти

Я столкнулся с проблемой при отправке данных по TCP с помощью специального протокола, который зависит от знания длины данных, поэтому я решил, что не могу отправить целое число из-за того, что размер целого числа может быть разной длины (целое число 10 имеет длину of 2, тогда как int 100 имеет длину 3), поэтому я решил вместо этого отправить 4-байтовое представление int и, таким образом, наткнулся на ByteBuffer.

В следующем примере я получаю исключение BufferUnderflowException.

try
{
    int send = 2147483642;
    byte[] bytes = ByteBuffer.allocate(4).putInt(send).array(); // gets [127, -1, -1, -6]
    int recieve = ByteBuffer.allocate(4).put(bytes).getInt(); // expected 2147483642; throws BufferUnderflowException
    if (send == recieve)
    {
        System.out.println("WOOHOO");
    }
}
catch (BufferUnderflowException bufe)
{
    bufe.printStackTrace();
}

person user3045798    schedule 20.09.2014    source источник
comment
Вы пропустили flip(), но это кажется довольно бессмысленным. Выбросьте все это и используйте DataOutputStream.writeInt() и друзей.   -  person user207421    schedule 20.09.2014


Ответы (1)


Вам нужно установить начальный индекс или буфер перемотки;

int recieve = ByteBuffer.allocate(4).put(bytes).getInt(0);
person Petar Butkovic    schedule 20.09.2014