我有一个字节大小为n的数组,它实际上代表了一个大小为n/2的数组。在将数组写入磁盘文件之前,我需要通过添加存储在另一个短阵列中的偏差值来调整值。在C++中,我只是将字节数组的地址分配给一个带有强制转换的短数组的指针,并使用指针算术或使用联合。我怎样才能访问一个字节数组作为Java中的短裤
这怎么可能在Java中完成 - 我对Java的BTW很陌生。
我有一个字节大小为n的数组,它实际上代表了一个大小为n/2的数组。在将数组写入磁盘文件之前,我需要通过添加存储在另一个短阵列中的偏差值来调整值。在C++中,我只是将字节数组的地址分配给一个带有强制转换的短数组的指针,并使用指针算术或使用联合。我怎样才能访问一个字节数组作为Java中的短裤
这怎么可能在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]);
}
此外,它取决于在许多方面流的endian - ness。这可能会更好
谢谢,你和亚历山大提供了我所需要的。 – 2010-03-23 19:18:26
如果你想循环所有的元素,你可以使用'while(sb.hasRemaining())'http://docs.oracle.com/javase/6/docs/api/java/nio/Buffer.html#hasRemaining () – Raekye 2013-06-30 17:01:05