【问题标题】:ByteBuffer Little Endian insert not workingByteBuffer Little Endian 插入不起作用
【发布时间】:2012-11-13 06:01:28
【问题描述】:

我必须在旧系统和安卓设备之间进行双向通信。 遗留系统使用小端字节序。 我已经成功实现了接收部分,但是发送不起作用。

奇怪,因为对我来说 ByteBuffer 类似乎出现故障(我简直不敢相信)

    ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();

结果: [0, 0, 0, 88]

    ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.order(ByteOrder.BIG_ENDIAN);
    byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();

结果也一样: [0, 0, 0, 88]

但是,如果我没记错,小端排序应该返回: [88, 0, 0, 0]

那么我错过了什么?

【问题讨论】:

    标签: java android bytebuffer endianness


    【解决方案1】:

    出于某种奇怪的原因,您正在重新初始化字节缓冲区并丢弃之前更改字节序的副本。以下代码对我来说很好用:

    ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.order(ByteOrder.BIG_ENDIAN);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();
    System.out.println(Arrays.toString(result));
    

    打印 [0, 0, 0, 88]

    ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();
    System.out.println(Arrays.toString(result));
    

    打印 [88, 0, 0, 0]

    【讨论】:

    • 也许 OP 有一种误解,即 ByteBuffer.order 进行全局更改,影响所有 ByteBuffers?
    • 我不敢相信,但我没有看到。第二次初始化不是故意的。我需要睡一会儿。无论如何,谢谢,
    【解决方案2】:

    关于相关说明:

    这段代码:

     int unicodePointsLen = textContent.length() * 2;
     ByteBuffer unicodePointsBuffer = ByteBuffer.allocateDirect(unicodePointsLen);
     short unicodePointValue;
     for (int i = 0; i < textContent.length(); i++) 
     {  
         unicodePointValue = (short)textContent.charAt(i);
         unicodePointsBuffer.put((byte)(unicodePointValue & 0x00FF)).put((byte)(unicodePointValue >> 8));
     }
    

    比这快 25%:

     int unicodePointsLen = textContent.length() * 2;
     ByteBuffer unicodePointsBuffer = ByteBuffer.allocateDirect(unicodePointsLen);
     unicodePointsBuffer.order(ByteOrder.LITTLE_ENDIAN);
     for (int i = 0; i < textContent.length(); i++) 
     {  
         unicodePointsBuffer.putShort((short)textContent.charAt(i));  
     }
    

    使用 JDK 1.8。

    我正在尝试通过 JNI 将 unicode 点从 JAVA 传递到 C++,第一种方法是我发现的最快的方法。好奇比第二个sn-p还快。

    【讨论】:

    • 加速并不奇怪。在内部 putShort() 也可能处理字节顺序,最后仍然使用 put(byte) 推送两个单独的字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2019-06-30
    • 1970-01-01
    • 2018-05-15
    • 2022-06-10
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多