字节数组到Int数组

我正在使用以下方法读取文件:

int len = (int)(new File(args[0]).length()); FileInputStream fis = new FileInputStream(args[0]); byte buf[] = new byte[len]; fis.read(buf); 

正如我在这里找到的。 是否可以将byte array buf转换为Int Array ? 将Byte Array转换为Int Array会占用更多空间吗?

编辑:我的文件包含数百万的整数,如,

100000000 200000000 …..(使用普通的int文件编写)。 我把它读到字节缓冲区。 现在我想将它包装到IntBuffer数组中。 怎么做 ? 我不想将每个字节转换为int。

您在评论中已经说过,您希望输入数组中的四个字节对应于输出数组上的一个整数,因此可以很好地解决。

取决于您是否期望字节为big-endian或little-endian顺序,但是……

  IntBuffer intBuf = ByteBuffer.wrap(byteArray) .order(ByteOrder.BIG_ENDIAN) .asIntBuffer(); int[] array = new int[intBuf.remaining()]; intBuf.get(array); 

完成,分为三行。

将字节数组的每4个字节转换为整数数组:

 public int[] convert(byte buf[]) { int intArr[] = new int[buf.length / 4]; int offset = 0; for(int i = 0; i < intArr.length; i++) { intArr[i] = (buf[3 + offset] & 0xFF) | ((buf[2 + offset] & 0xFF) << 8) | ((buf[1 + offset] & 0xFF) << 16) | ((buf[0 + offset] & 0xFF) << 24); offset += 4; } return intArr; } 

在java中:

  • byte = 8位
  • 整数 = 32位

对于转换,您可以执行以下操作:

 byte[] byteArray = new byte[] {123, 12, 87}; int[] intArray = new int[byteArray.length]; // converting byteArray to intArray for (int i = 0; i < byteArray.length; intArray[i] = byteArray[i++]); System.out.println(Arrays.toString(intArray)); 

这将输出:

 [123, 12, 87] 

这对你好吗?

  int IntToByte(byte arrayDst[], int arrayOrg[], int maxOrg){ int i; int idxDst; int maxDst; // maxDst = maxOrg*4; // if (arrayDst==null) return 0; if (arrayOrg==null) return 0; if (arrayDst.length < maxDst) return 0; if (arrayOrg.length < maxOrg) return 0; // idxDst = 0; for (i=0; i> 8); idxDst++; arrayDst[idxDst] = (byte)(arrayOrg[i] >> 16); idxDst++; arrayDst[idxDst] = (byte)(arrayOrg[i] >> 24); idxDst++; } // return idxDst; } int ByteToInt(int arrayDst[], byte arrayOrg[], int maxOrg){ int i; int v; int idxOrg; int maxDst; // maxDst = maxOrg/4; // if (arrayDst==null) return 0; if (arrayOrg==null) return 0; if (arrayDst.length < maxDst) return 0; if (arrayOrg.length < maxOrg) return 0; // idxOrg = 0; for (i=0; i 

定义“显着”。 在java中,int是4个字节,因此根据定义,数组将是空间的4倍。 请参阅: http : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

在转换过程中,你必须同时拥有两个,所以在复制部分,如果你一次复制整个数组,你将会使用更多。

至于转换,有很多相关的问题:

Java – 将音频的字节数组转换为整数数组

用于将字节数组转换为整数数组的解决方案,其中每组4个字节表示一个整数。 字节输入是byte[] srcByte 。 int输出是dstInt[]

Little-endian源字节:

  int shiftBits; int byteNum = 0; int[] dstInt = new int[srcByte.length/4]; //you might have to hard code the array length //Convert array of source bytes (srcByte) into array of integers (dstInt) for (int intNum = 0; intNum < srcByte.length/4; ++intNum) { //for the four integers dstInt[intNum] = 0; //Start with the integer = 0 for(shiftBits = 0; shiftBits < 32; shiftBits += 8) { //Add in each data byte, lowest first dstInt[intNum] |= (srcByte[byteNum++] & 0xFF) << shiftBits; } } 

对于Big-Endian替换此行:

  for(shiftBits = 24; shiftBits >= 0; shiftBits -= 8) //Add in each data byte, highest first 

创建一个新的int数组并复制值,根据需要进行转换。

 int[] arr = new int[len]; for(int i = 0; i < len; i++) arr[i] = (int)buf[i];