将int []转换为byte []而不创建新对象

时间:2009-08-24 14:42:35

标签: java

我在java中有一个int [],我想将其转换为byte []。

现在通常的做法是创建一个新的byte [] 4倍于int数组的大小,并将所有的int字节逐字节复制到新的字节数组中。

然而,这样做的唯一原因是因为java的类型安全规则。 int数组已经是一个字节数组。它只是java不允许将int []转换为byte []然后将其用作byte []。

有没有办法,也许使用jni,使int数组看起来像java的字节数组?

3 个答案:

答案 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进行,并使用它的getIntputInt方法来访问int值。当您需要以字节为单位访问缓冲区时,可以使用getput方法。 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来做到这一点,但我很确定它不能在语言中完成。

我也非常好奇现有代码的样子以及你期望的额外速度。

你知道优化规则,对吧?

  • 1)不要优化。
  • 2)如果您是专家,请参阅规则1.
  • 3)如果您是专家,可以编写最清晰的代码并进行失败的时序测试,那么:
  • 3a)编写优化版本并将未经优化的代码保留为注释
  • 3b)重新测试,如果您的优化代码未通过速度测试,则还原!
  • 3c)解释为什么你在评论中用这种方式编码。包括您的速度测量和参考要求。
  • 3d)如果规则3似乎工作太多,请参阅规则1