【问题标题】:How to convert bytes to long in java如何在java中将字节转换为long
【发布时间】:2013-02-20 12:01:21
【问题描述】:

这里我有一个字符串,我将此字符串转换为长字符串,然后将此长字符串值转换为字节。这个字节数组长度为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]

现在我想像以前一样在字符串中转换这个输出字节 "02201156116"

所以在这里我必须首先在 BIG_ENDIAN 中排序字节,然后包装 Bytes 并从中获取 long 值。 但是在这里我很惊讶为什么它不适用于

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

这个和它的工作

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong() 这个,顺便说一句,我们必须应用 BIG_ENDIAN,因为当我们将 long 转换为字节时,我们使用了 LITTLE_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);

【问题讨论】:

  • 我读的问题正确吗?你的问题还没解决吗?
  • 如果你只给它 6 个字节,ByteBuffer.getLong 不会抛出异常(因为 long 是 8 个字节)?
  • @IanRoberts:byte[] 的大小为 8。他只复制了 6 个字节,但这没关系。
  • “它不起作用”是什么意思?任何最多 8 个字节的序列都可以做成 long,因为“8 bytes”和“long”本质上是一回事。
  • @Ingo 在这里我知道我解决了这个问题,但我想知道当我将 long 转换为 byte 时我使用了 little endian 但是当我将字节转换为 long 时我必须使用大端,但我使用大端,它不起作用。它只适用于小端。

标签: java bytearray endianness


【解决方案1】:

考虑一下short。假设我们对值 258 进行编码:

258 = 256 + 2 = 0x0102

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

{ 0x01, 0x02 }

{ 0x02, 0x01 }

没有顺序本身比另一个更好,但关键是要记住我们使用的顺序,当我们想要解码数组并想要取回值 258 时。

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

因此,为了不搞砸,请务必在编码和解码时使用相同字节顺序。

【讨论】:

  • 是的,我得到了你的答案,感谢你给出这个答案。
  • 这里编码是指 ByteBuffer.allocate() ,解码是指 ByteBuffer.wrap() ?我说的对吗?
  • @Sam_k - 编码 = putLong,解码 = getLong。
  • So Your This line is my main answer : This is the purpose of LITTLE_ENDIAN and BIG_ENDIAN. On encoding, it tells the byte order to use. On decoding, it tells the byte order we used when we encoded.
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2012-09-30
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多