Java 小端顺序

发布于 2024-10-07 00:12:31 字数 835 浏览 0 评论 0原文

我需要将数据存储为 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));
}

对于LITTLE_ENDIAN,应该如何使用 ByteBuffer 重写它,因为以下代码对我不起作用:

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

I need to store data as LITTLE_ENDIAN instead of default BIG_ENDIAN.

Here's my sample code:

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));
}

How should it be rewritten with ByteBuffer, for LITTLE_ENDIAN, as the following code doesn't work for me:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乖乖哒 2024-10-14 00:12:31

如果您使用 putInt 而不是 put,则 ByteBuffer 将适合您。

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

字节数组(如Integer.byteValue())没有“字节顺序”,因此它按原样存储。

ByteBuffer will work for you, if you use putInt and not put.

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

A byte array (as Integer.byteValue()) has no "endianness" so it is stored as it is.

誰認得朕 2024-10-14 00:12:31

正如 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

As andcoz says, the endian isn't taken into account when you put one byte at a time. Here is an example to show you how to do it:

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();
        }
    }
}

Output:

logo:
aabbccdd
11223344

logoLE:
ddccbbaa
44332211
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文