У меня есть массив байта, размер n, который действительно представляет массив за исключением размера n/2. Прежде чем я запишу массив в дисковый файл, я должен скорректировать значения путем добавления значений предвзятости, сохраненных в другом массиве коротких. В C++ я просто присвоил бы адрес массива байтов к указателю для короткого массива с броском, чтобы закоротить и использовать адресную арифметику с указателями или использовать объединение.
Как это может быть сделано в Java - я очень плохо знаком с Java BTW.
Вы можете заключить свой байтовый массив в 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
Вы могли бы выполнить битовую перестановку самостоятельно, но я бы рекомендовал взглянуть на Классы 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.
Правильный способ сделать это - использовать смены. Итак
for (int i = 0; i < shorts.length; i++) {
shorts[i] = (short)((bytes[2*i] << 8) | bytes[2*i + 1]);
}
Кроме того, это во многом зависит от порядка байтов потока. Это может работать лучше