【问题标题】:Converting byte array values in little endian order to short values以小端顺序将字节数组值转换为短值
【发布时间】:2013-01-27 10:55:38
【问题描述】:

我有一个字节数组,其中数组中的数据实际上是短数据。字节以小端序排列:

3、1、-48、0、-15、0、36、1

当转换为短值时会导致:

259、208、241、292

Java 中有没有一种简单的方法可以将字节值转换为相应的短值?我可以编写一个循环,只获取每个高字节并将其移动 8 位,然后将其与低字节进行 OR,但这会影响性能。

【问题讨论】:

  • 你已经给出了 8 个字节,然后是 4 个 longs... 而 8 个字节应该只产生一个 single long 值。此外,您还没有说出您的预期。基本上你的问题目前还不清楚......
  • 不,不清楚。您拥有来自字节数组的数据及其转换为的内容。再明显不过了。
  • 是的,可以。因为听起来您实际上转换为short,而不是long...而且您还没有说出您期望的结果。不要让问题变得更清楚 - 但请记住,您是寻求帮助的人,您的问题越好,帮助可能就越好。
  • @AndroidDev 请仔细阅读 Jon 的消息。他真的知道自己在说什么。
  • @AndroidDev:让我们看看到底有什么不清楚的地方:1) 为什么你期望 8 个 byte 值中有 4 个 long 值,而 long 有 8 个字节的数据; 2) 您使用什么代码来获取 incorrect 值; 3)您期望如何处理负数; 4)为什么你对试图帮助你的人无礼。

标签: java arrays byte endianness


【解决方案1】:
 /* Try this: */
public static short byteArrayToShortLE(final byte[] b, final int offset) 
{
        short value = 0;
        for (int i = 0; i < 2; i++) 
        {
            value |= (b[i + offset] & 0x000000FF) << (i * 8);
        }            

        return value;
 }

 /* if you prefer... */
 public static int byteArrayToIntLE(final byte[] b, final int offset) 
 {
        int value = 0;

        for (int i = 0; i < 4; i++) 
        {
           value |= ((int)b[i + offset] & 0x000000FF) << (i * 8);
        }

       return value;
 }

【讨论】:

    【解决方案2】:

    使用java.nio.ByteBuffer,您可以指定所需的字节序:order()

    ByteBuffer 具有将数据提取为 byte、char、getShort()getInt()、long、double...的方法。

    这是一个如何使用它的示例:

    ByteBuffer bb = ByteBuffer.wrap(byteArray);
    bb.order( ByteOrder.LITTLE_ENDIAN);
    while( bb.hasRemaining()) {
       short v = bb.getShort();
       /* Do something with v... */
    }
    

    【讨论】:

    • (只是不要指望getLong() 会根据问题中的示例数据转换 两个 字节。您需要为此调用getShort()。)
    • 实际上,我想要得到结果的 getShort。不过,您的解决方案是正确的。
    • @AndroidDev:您意识到,在幕后,这是在精确地执行您声称的按位 OR 对(可能是不可接受的)性能影响,对吧?
    • @AndroidDev:它们不是原生的。它们是用 Java 编写的,据我所知,Hotspot 将以同样的方式 JIT 您自己的代码。按照代码路径查看 ByteBuffer、HeapByteBuffer、Bits 很容易。事实上,考虑到间接层,我怀疑如果您手动编写代码,它会比使用 ByteBuffer。在假设性能受到显着影响之前,您是否对其进行了测试?
    • @JonSkeet 你是对的。上面的代码比仅仅移动和 ORing 字节慢大约 6 倍。相当惊讶。
    猜你喜欢
    • 2010-12-24
    • 2013-12-30
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2018-05-27
    相关资源
    最近更新 更多