9

サイズ n/2 の short の配列を実際に表す、サイズ n のバイト配列があります。配列をディスク ファイルに書き込む前に、別の short 配列に保存されているバイアス値を追加して値を調整する必要があります。C++ では、バイト配列のアドレスを short 配列のポインタに割り当て、short にキャストしてポインタ演算を使用するか、union を使用します。

Javaでこれを行うにはどうすればよいですか-私はJava BTWに非常に慣れていません。

4

3 に答える 3

9

自分で少しいじることもできますが、ByteBufferShortBufferクラスを確認することをお勧めします。

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.
于 2010-03-23T00:19:46.873 に答える
8

バイト配列を 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
于 2010-03-23T00:28:03.427 に答える
4

これを行う正しい方法は、シフトを使用することです。そう

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

また、多くの点でストリームのエンディアンに依存します。これはうまくいくかもしれません

于 2010-03-23T00:28:56.780 に答える