2013-09-25 4 views
2

Может кто-нибудь, пожалуйста, дайте мне знать, как преобразовать ByteBuffer в длинный []?Как преобразовать ByteBuffer в long [] в Java

У меня был длинный [], чтобы начать с, который я преобразуется в ByteBuffer, используя следующий фрагмент кода:


byte[] convertToByteArray(long[] data) { 
    ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 8);; 
    LongBuffer longBuffer = byteBuffer.asLongBuffer(); 
    longBuffer.put(data); 
    return byteBuffer.array(); 
} 

Теперь я хотел бы сделать наоборот, и напишите несколько тестов, сравнивающих различные массивы до и после преобразования.

Я попытался следующие, но это не удается с NPE на JDK 1.6.0_26:


long[] convertToLongArray(byte[] bArray) { 
    ByteBuffer byteBuffer = ByteBuffer.wrap(bArray); 
    LongBuffer longBuffer = byteBuffer.asLongBuffer(); 
    return longBuffer.array(); 
} 

С уважением, Рошан

+3

Что говорит StackTrace NPE? Часто бывает полезно предоставить достаточную информацию, если у вас есть проблема. – Kayaman

+4

Действительно странно, что вы поместили данные в 'longBuffer' и вернули' byteBuffer.array() ', и все же вы считаете, что в первом случае вы получили правильный вывод. – SudoRahul

+0

@ R.J ByteBuffer должен действовать как буфер поддержки, при этом LongBuffer является только представлением для него, поэтому код должен быть точным. Он просто разгружает операцию преобразования длинного 8 байта в LongBuffer. – Kayaman

ответ

3

на моей стороне она бросает

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.nio.LongBuffer.array(LongBuffer.java:994) 
    at test.convertToLongArray(test.java:11) 
    at test.main(test.java:15) 

Это делает b ecause экземпляр, возвращенный byteBuffer.asLongBuffer(), вызывает ByteBufferAsLongBufferL или ByteBufferAsLongBufferB класс (в зависимости от индианности). Оба эти 2 класса являются подклассами LongBuffer и внутри конструктора вызова super конструктор вызывается без длинного массива .

Как упоминалось в описании @Kayaman, это только виды для байтового массива ByteBuffer.

Ниже представлен супер конструктор, вызываемый из конструктора ByteBufferAsLongBufferL. Обратите внимание на параметр null.

LongBuffer(int mark, int pos, int lim, int cap) { // package-private 
    this(mark, pos, lim, cap, null, 0); 
} 

Самый лучший вариант, чтобы сделать это:

long[] convertToLongArray(byte[] bArray) { 
    ByteBuffer byteBuffer = ByteBuffer.wrap(bArray); 
    LongBuffer longBuffer = byteBuffer.asLongBuffer(); 
    long l[] = new long[longBuffer.capacity()]; 
    longBuffer.get(l); 
    return l; 
} 
+1

Спасибо большое! Просто решение, которое я искал. Missed LongBuffer # get (long []). – Roshan

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