我在java中有一个int [],我想将其转换为byte []。
现在通常的做法是创建一个新的byte [] 4倍于int数组的大小,并将所有的int字节逐字节复制到新的字节数组中。
然而,这样做的唯一原因是因为java的类型安全规则。 int数组已经是一个字节数组。它只是java不允许将int []转换为byte []然后将其用作byte []。
有没有办法,也许使用jni,使int数组看起来像java的字节数组?
答案 0 :(得分:9)
没有。无法使用本机Java阵列接口实现对象。
听起来我想要一个包装int []的对象,并提供以字节数组方式访问它的方法。 e.g。
public class ByteArrayWrapper {
private int[] array;
public int getLength() {
return array.length * 4;
}
public byte get(final int index) {
// index into the array here, find the int, and then the appropriate byte
// via mod/div/shift type operations....
int val = array[index / 4];
return (byte)(val >> (8 * (index % 4)));
}
}
(上面没有测试/编译等,取决于你的字节顺序要求。它纯粹是说明)
答案 1 :(得分:4)
根据您的确切要求,您可以使用NIO的java.nio.ByteBuffer
课程。将您的初始分配作为ByteBuffer进行,并使用它的getInt
和putInt
方法来访问int值。当您需要以字节为单位访问缓冲区时,可以使用get
和put
方法。 ByteBuffer还有一个asIntBuffer
方法,它将默认的get和put行为更改为int而不是byte。
如果您正在使用JNI,直接分配的ByteBuffer(在某些情况下)允许在C代码中直接指针访问。
http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html
例如,
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
// …
int[] intArray = { 1, 2, 3, 4 };
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(intArray);
byte[] byteArray = byteBuffer.array();
答案 2 :(得分:1)
如果你真的不得不这样做,你可以使用外部调用C来做到这一点,但我很确定它不能在语言中完成。
我也非常好奇现有代码的样子以及你期望的额外速度。
你知道优化规则,对吧?