Как я могу получить доступ к байтовому массиву как шорт в Java - PullRequest
9 голосов
/ 23 марта 2010

У меня есть массив байтов, размер n, который действительно представляет массив с размером n / 2. Перед тем, как записать массив в файл на диске, мне нужно настроить значения, добавив значения смещения, хранящиеся в другом массиве short. В C ++ я просто назначил бы адрес байтового массива указателю на короткий массив с приведением к короткому и использовал бы арифметику указателя или использовал бы объединение.

Как это можно сделать в Java - я очень новичок в Java.

Ответы [ 3 ]

9 голосов
/ 23 марта 2010

Вы могли бы сделать бит-тиддлинг самостоятельно, но я бы рекомендовал взглянуть на классы ByteBuffer и ShortBuffer.

byte[] arr = ...
ByteBuffer bb = ByteBuffer.wrap(arr); // Wrapper around underlying byte[].
ShortBuffer sb = bb.asShortBuffer(); // Wrapper around ByteBuffer.

// Now traverse ShortBuffer to obtain each short.
short s1 = sb.get();
short s2 = sb.get(); // etc.
8 голосов
/ 23 марта 2010

Вы можете заключить свой байтовый массив в java.nio.ByteBuffer.

byte[] bytes = ...
ByteBuffer buffer = ByteBuffer.wrap( bytes );

// you may or may not need to do this
//buffer.order( ByteOrder.BIG/LITTLE_ENDIAN );

ShortBuffer shorts = buffer.asShortBuffer( );

for ( int i = 0, n=shorts.remaining( ); i < n; ++i ) {
    final int index = shorts.position( ) + i;

    // Perform your transformation
    final short adjusted_val = shortAdjuster( shorts.get( index ) );

    // Put value at the same index
    shorts.put( index, adjusted_val );
}

// bytes now contains adjusted short values
4 голосов
/ 23 марта 2010

Правильный способ сделать это - использовать смены. Так

for (int i = 0; i < shorts.length; i++) {
    shorts[i] = (short)((bytes[2*i] << 8) | bytes[2*i + 1]);
}

Кроме того, во многих отношениях это зависит от порядкового номера потока. Это может работать лучше

...