如何从字节数组中提取长数据类型?

Posted

技术标签:

【中文标题】如何从字节数组中提取长数据类型?【英文标题】:How to extract long data type from the byte array? 【发布时间】:2016-11-02 19:01:43 【问题描述】:

我需要创建一个字节数组,这样前八个字节应该是当前时间戳,其余字节应该是原样。然后从同一个字节数组中提取我放在首位的时间戳。

  public static void main(String[] args) 
    long ts = System.currentTimeMillis();
    byte[] payload = newPayload(ts);
    long timestamp = bytesToLong(payload);
    System.out.println(timestamp);
  

  private static byte[] newPayload(long time) 
    ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
    byte[] payload = new byte[300];
    Arrays.fill(payload, (byte) 1);
    buffer.putLong(time);
    byte[] timeBytes = buffer.array();
    System.arraycopy(timeBytes, 0, payload, 0, timeBytes.length);
    return payload;
  

  public static long bytesToLong(byte[] bytes) 
    byte[] newBytes = Arrays.copyOfRange(bytes, 0, (Long.SIZE / Byte.SIZE - 1));
    ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
    buffer.put(newBytes);
    buffer.flip();// need flip
    return buffer.getLong();
  

上面的代码给了我异常,我不确定有什么问题?

Exception in thread "main" java.nio.BufferUnderflowException
    at java.nio.Buffer.nextGetIndex(Buffer.java:498)
    at java.nio.HeapByteBuffer.getLong(HeapByteBuffer.java:406)

【问题讨论】:

【参考方案1】:

来自Arrays.copyOfRange的文档:

to - 要复制的范围的最终索引,独占。 (此索引可能位于数组之外。)

这意味着,您没有将足够的字节放入缓冲区。 所以正确的做法是:

byte[] newBytes = Arrays.copyOfRange(bytes, 0, Long.SIZE / Byte.SIZE);

【讨论】:

以上是关于如何从字节数组中提取长数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 3 中的字节数组中的特定位中提取值?

C#如何从字节数组中提取字节?已知起始字节

如何从 ByteBuffer 中提取使用过的字节数组?

如何在 C++ 中从字节数组(在 BIG-ENDIAN 中)中提取单个字段

如何从长指针中提取 little-endian unsigned short?

如何将一个字节数组转换为两个长值?