Проблемы Java ByteBuffer с типами со знаком и без знака, преобразовывающими байтовый массив в целое число - PullRequest
4 голосов
/ 16 июня 2011

Я ожидал этого:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == 222

Однако верно следующее:

ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 }).getInt() == -570425344

Как мне обойти это еще одно из многих ограничений Java с подписанными / неподписанными типами или мне нужно полностью свернуть свое собственное?

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Код:

public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
    System.out.println(bb.order());
    System.out.println(bb.getInt() == 222);
    bb.rewind();
    bb.order(ByteOrder.LITTLE_ENDIAN);
    System.out.println(bb.order());
    System.out.println(bb.getInt() == -570425344);
}

Консоль

BIG_ENDIAN
true
LITTLE_ENDIAN
true

Приложение: Для справки: «Порядок вновь созданного байтового буфера всегда BIG_ENDIAN.» - ByteBuffer#order()

3 голосов
/ 16 июня 2011

Результат, который вы наблюдаете, верен для машины с прямым порядком байтов. Я подозреваю, что если вы выполните следующее, вы получите LITTLE_ENDIAN в качестве ответа.

ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
System.out.println(bb.order());

Если вы хотите принудительно упорядочить порядок байтов для вашего буфера, выполните следующие действия:

ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, -34 });
bb.order(ByteOrder.BIG_ENDIAN);
System.out.println(bb.order());
System.out.println(bb.getInt( ));

Следует распечатать:

BIG_ENDIAN
222
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...