Пожалуйста, проверьте: этот преобразователь читает массив байтов как Big-Endian?

Я переношу кое-что с C# на Java, и мне нужен класс, который может преобразовывать байты в примитивы, как 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?

Если да, то есть ли простой способ сделать это с прямым порядком байтов?


person Ted    schedule 07.01.2010    source источник


Ответы (2)


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

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

person jdmichal    schedule 07.01.2010
comment
Спасибо, я решил сделать это вручную, поменяв местами индексы массива. ИЦ несколько минут работы, а потом идем дальше =) - person Ted; 08.01.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);

вы поняли :-)

person rsp    schedule 07.01.2010