如何在java中将字节转换为long

时间:2013-02-20 12:01:21

标签: java bytearray endianness

这里我有一个String,我将此字符串转换为long,而不是将此long值转换为字节。该字节数组长度为6。

    final byte[] tagBytes = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN)
            .putLong(Long.parseLong("02201156116")).array();
    System.arraycopy(tagBytes, 0, tag, 0, 6);
    Log.d("TAG", "TAG in bytes "+Arrays.toString(tag));

这里我得到了像[52, 84, 49, -125, 0, 0]

这样的输出

现在我想在String中转换此输出字节,就像"02201156116"

之前一样

所以在这里我首先要先在BIG_ENDIAN中对字节进行排序然后包装Bytes并从中获取长值。 但在这里我很惊讶为什么它不起作用

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.BIG_ENDIAN).getLong() 

这和它的工作

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong()这个,顺便说一下,当我们使用LITTLE_ENDIAN将long转换为字节时,我们必须应用BIG_ENDIAN。所以我认为我们必须在这里使用BIG_ENDIAN。但它不适用于BIG_ENDIAN,它适用于LITTLE_ENDIAN。

此代码用于将[52, 84, 49, -125, 0, 0]转换为02201156116

    long time,time1;
    final byte[] tempDateBytes = new byte[8];
    System.arraycopy(tagBytes, 0, tempDateBytes, 0, 6);
    time1 = ByteBuffer.wrap(tempDateBytes).order(ByteOrder.BIG_ENDIAN).getLong();
    time = ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong();
    Log.d("TAG", "Orignal TAG "+time);
    Log.d("TAG", "BAD TAG  "+time1);

1 个答案:

答案 0 :(得分:2)

根据short来考虑一下。假设我们编码值258:

258 = 256 + 2 = 0x0102

现在,如果我们把它放在一个数组中,我们必须决定在索引0处放入哪个字节。我们可以做到

{ 0x01, 0x02 }

{ 0x02, 0x01 }

没有订单本身比另一订单更好,但关键是要记住我们使用的订单,当我们想要解码数组并想要获得值258时。

这是LITTLE_ENDIAN和BIG_ENDIAN的目的。在编码时,它告诉使用的字节顺序。在解码时,它告诉我们编码时使用的字节顺序。

因此,为了不搞乱,请确保在编码和解码时使用相同的字节顺序。