Пожалуйста, проверьте: этот конвертер читает байтовый массив как Big-Endian? - PullRequest
0 голосов
/ 08 января 2010

Я портирую некоторые вещи из C # в JAVA, и мне нужен класс, который может конвертировать байты в примитивы, просто Lite BitConverter в .NET может.

Как я только что опубликовал здесь , я заметил, что мой компьютер использует Little-Endian (Intel) и BitConverter работает как положено:

// C# code
byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);

b2short == 256, как и ожидалось.

Ну, мне нужен был "BitConverter" в JAVA, и я нашел этот кусок кода . Однако, когда я пробую это в JAVA, мне кажется, что методы интерпретируют байтовые массивы как Big-Endian. JAVA-код:

// JAVA code
byte[] b2 = new byte[] { 0, 1 };
short b2short = MyFoundConverter.BitConverter.toShort(b2, 0);

В данном случае, b2short == 1, и это мне кажется как Big-Endian.

Вопрос: Может ли кто-нибудь, кто знает эти побитовые операторы, сказать мне, действительно ли код, найденный на этой веб-странице , интерпретирует массив байтов как Big-Endian?

Если так , есть ли простой способ сделать его Little-Endian?

Привет

Ответы [ 2 ]

1 голос
/ 08 января 2010

Код, на который вы ссылаетесь, берет первый байт и делает его старшим байтом короткого. Второй байт входит в младший байт короткого. Так что это операция с прямым порядком байтов. Как бы это ни было закодировано, не было бы простого способа исправить это, кроме как идти методом по методу и менять местами индексы массива, так что самый высокий индекс становится самым низким.

Я нашел другой кодовый бит , который будет принимать тип данных и менять его порядковый номер. Может быть, вы можете объединить два.

0 голосов
/ 08 января 2010

Код, который вам нужен:

byte[] b2 = new byte[] { 0, 1 };
short b2short = b2[0] | (b2[1] << 8);

и для значений int:

byte[] b4 = new byte[] { 0, 1, 2, 3 };
int b4int = b4[0] | (b4[1] << 8) | (b4[2] << 16) | (b4[3] << 24);

Вы поняли: -)

...