разные результаты при преобразовании int в байтовый массив - .NET против Java - PullRequest
5 голосов
/ 07 мая 2011

Я пытаюсь отправить данные из java-клиента на сервер ac # и у меня возникают проблемы при преобразовании int в байтовый массив.

, когда я конвертирую число 8342 с помощью c #, используя этот код:

BitConverter.GetBytes(8342)

результат: x [4] = {150, 32, 0, 0}

с использованием java:

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt(8342); 
return bb.array();

и вот результат: x [4] = {0, 0, 32, -106}

Может кто-нибудь объяснить?Я новичок в Java, и это первый раз, когда я вижу отрицательные числа в байтовых массивах.

1 Ответ

9 голосов
/ 07 мая 2011

Вы должны изменить порядковый номер:

 bb.order(ByteOrder.LITTLE_ENDIAN)

Java хранит вещи внутренне как Big Endian, тогда как .NET по умолчанию является Little Endian.

Кроме того, между Java и .NET существует разница в знаке и без знака. Java использует подписанные байты, C # использует unsigned. Вам также придется это изменить.

По сути, именно поэтому вы видите -106 (150 - 256)

Вам нужно будет сделать что-то вроде утилиты, описанной ниже:

public static void putUnsignedInt (ByteBuffer bb, long value)
    {
       bb.putInt ((int)(value & 0xffffffffL));
    }

Обратите внимание, что значение long.

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