【问题标题】:Testing both LITTLE_ENDIAN and BIG_ENDIAN scenarios测试 LITTLE_ENDIAN 和 BIG_ENDIAN 场景
【发布时间】:2019-02-19 22:32:03
【问题描述】:

如果我需要以不同方式处理LITTLE_ENDIANBIG_ENDIAN 案例,如果我的系统使用LITTLE_ENDIAN,我该如何测试BIG_ENDIAN 案例?当系统的ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN),你怎么测试ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN)的情况?因为 byteBuffer .order(ByteOrder.BIG_ENDIAN) 只是改变了字节缓冲区的顺序而不是系统的顺序吗?

【问题讨论】:

    标签: java nio endianness


    【解决方案1】:

    使用ByteBuffer。它有方法order(ByteOrder bo):

    修改此缓冲区的字节顺序。

    参数:
    bo - 新的字节顺序,BIG_ENDIANLITTLE_ENDIAN

    注意ByteBuffer 的 javadoc 说:

    字节缓冲区的初始顺序始终为BIG_ENDIAN

    例子

    int value = 123456789;
    byte[] bigEndian = ByteBuffer.allocate(Integer.BYTES)
            .order(ByteOrder.BIG_ENDIAN)
            .putInt(value)
            .array();
    byte[] littleEndian = ByteBuffer.allocate(Integer.BYTES)
            .order(ByteOrder.LITTLE_ENDIAN)
            .putInt(value)
            .array();
    System.out.printf("value = 0x%08x = %d%n", value, value);
    System.out.println(Arrays.toString(bigEndian));
    System.out.println(Arrays.toString(littleEndian));
    

    输出

    value = 0x075bcd15 = 123456789
    [7, 91, -51, 21]
    [21, -51, 91, 7]
    

    【讨论】:

    • 当系统的 ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN) 怎么样。您如何测试 ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN) 的情况?因为 byteBuffer .order(ByteOrder.BIG_ENDIAN) 只是改变了字节缓冲区的顺序而不是系统的顺序吗?
    • @Artanis 没有什么可以改变系统的字节顺序。它是硬连线到 CPU 中的。 --- "如何测试 ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN) 的情况?" 在 CPU 为 big-endian 的系统上运行代码。
    • 好的,我的问题仍然是如何测试其他场景?
    • 所以我需要找一台大端的新计算机来运行我的代码只是为了测试它的功能,没有其他方法吗?
    • @Artanis Java 的全部意义在于它可以在任何地方运行,这意味着 Java 本身在大端和小端系统上的行为相同。 您的 Java 代码应该关心本机字节顺序是什么,除非它与用其他关心的语言编写的代码进行通信。
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多