【发布时间】:2011-01-30 14:22:59
【问题描述】:
我有一个字节数组,大小为 n,它真正表示一个大小为 n/2 的数组。在我将数组写入磁盘文件之前,我需要通过添加存储在另一个短数组中的偏差值来调整值。在 C++ 中,我只需将字节数组的地址分配给具有强制转换为 short 的短数组的指针,并使用指针算术或使用联合。
这如何在 Java 中完成 - 我对 Java BTW 很陌生。
【问题讨论】:
我有一个字节数组,大小为 n,它真正表示一个大小为 n/2 的数组。在我将数组写入磁盘文件之前,我需要通过添加存储在另一个短数组中的偏差值来调整值。在 C++ 中,我只需将字节数组的地址分配给具有强制转换为 short 的短数组的指针,并使用指针算术或使用联合。
这如何在 Java 中完成 - 我对 Java BTW 很陌生。
【问题讨论】:
您可以自己做一些小游戏,但我建议您看看 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.
【讨论】:
while (sb.hasRemaining())
你可以用 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
【讨论】:
执行此操作的正确方法是使用班次。所以
for (int i = 0; i < shorts.length; i++) {
shorts[i] = (short)((bytes[2*i] << 8) | bytes[2*i + 1]);
}
此外,它在许多方面取决于流的字节顺序。这可能会更好
【讨论】: