Java порядок байтов - PullRequest
       20

Java порядок байтов

4 голосов
/ 09 декабря 2010

Мне нужно хранить данные как LITTLE_ENDIAN вместо значения по умолчанию BIG_ENDIAN.

Вот мой пример кода:

for (int i = 0; i < logo.length; i++) {
  logoArray[i] = ((Integer) logo[i]).byteValue();

  logoArray[i] = (byte) (((logoArray[i] & 1) << 7) + ((logoArray[i] & 2) << 5) + ((logoArray[i] & 4) << 3)
      + ((logoArray[i] & 8) << 1) + ((logoArray[i] & 16) >> 1) + ((logoArray[i] & 32) >> 3)
      + ((logoArray[i] & 64) >> 5) + ((logoArray[i] & 128) >> 7));
}

Как это следует переписать с помощью ByteBuffer для LITTLE_ENDIAN, так как следующий код не работает для меня:

 ByteBuffer record = ByteBuffer.allocate(logo.length);
 record.order(ByteOrder.LITTLE_ENDIAN);
 ...
 record.put(((Integer) logo[i]).byteValue());
 ...
 record.array(); // get

Ответы [ 2 ]

3 голосов
/ 09 декабря 2010

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

import java.nio.*;

public class Test {

    public static void main(String[] args) {

        int[] logo = { 0xAABBCCDD, 0x11223344 };
        byte[] logoLE = new byte[logo.length * 4];

        ByteBuffer rec = ByteBuffer.wrap(logoLE).order(ByteOrder.LITTLE_ENDIAN);

        for (int i = 0; i < logo.length; i++)
            rec.putInt(logo[i]);

        // Debug printouts...
        System.out.println("logo:");
        for (int b : logo)
            System.out.println(Integer.toHexString((b < 0 ? b + 256 : b)));

        System.out.println("\nlogoLE:");
        int tmp = 0;
        for (byte b : logoLE) {
            System.out.print(Integer.toHexString((b < 0 ? b + 256 : b)));
            if (++tmp % 4 == 0)
                System.out.println();
        }
    }
}

Вывод:

logo:
aabbccdd
11223344

logoLE:
ddccbbaa
44332211
2 голосов
/ 09 декабря 2010

ByteBuffer будет работать для вас, если вы используете putInt, а не put.

record.putInt((Integer) logo[i]);

Массив байтов (как Integer.byteValue()) не имеет «порядка байтов», поэтому он сохраняется как есть.

...