字节数组到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];