2016-11-02 6 views
0

Мне нужно сделать массив байтов таким образом, чтобы первые восемь байтов были текущей меткой времени, а оставшиеся байты должны быть такими, какие есть. И затем из того же массива байтов я хочу извлечь временную метку, которую я поставил в первую очередь.Как извлечь длинный тип данных из массива байтов?

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) 

ответ

2

Из документации Arrays.copyOfRange:

до - итоговый показатель диапазона должен быть скопирован, эксклюзив. (Этот индекс может находиться вне массива.)

Это означает, что вы не поставили достаточное количество байтов в буфер. Таким образом, правильный способ:

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

 Смежные вопросы

  • Нет связанных вопросов^_^