如何将字节数组转换为整数数组

22

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

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数组中。 如何做到这一点? 我不想将每个字节转换为整数。


7
为什么你想要将一个字节数组转换成一个整型数组? - vidit
但你可以这样阅读:int c =(int)array [0]; - Francisco Spaeth
@nhahtdh,这需要很多时间。我刚刚发现可以将其包装在IntBufer中。我想知道怎么做? - alessandro
2
每个int存储在32位上,而byte存储在8位上,因此它将占用大约4倍的空间。 - Pshemo
1
@alessandro,你想将数组转换成每个4字节存储在一个int元素中吗?如果是这样的话,这篇文章可能会对你有帮助。 - Pshemo
显示剩余5条评论
7个回答

58

你在评论中提到希望从输入数组中获取四个字节与输出数组中的一个整数对应,这非常好。

取决于你期望字节是大端序还是小端序,但是......

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

三行代码搞定。


2
当然,这假设您希望将每组4个字节翻译为int,而不是每个字节。 - Matt
是的,在对其他答案的评论中,OP 暗示了这一点。 - Louis Wasserman
如何使上述代码将每个字节解释为一个整数?一个由4个字节组成的数组将变成一个由4个整数组成的数组。 - daparic
1
@typelogic:你不能那样做。用手动循环来做。int[] intArray = new int[byteArray.length]; for (int i = 0; i < byteArray.length; i++) { intArray[i] = byteArray[i]; } - Louis Wasserman

6
将字节数组中的每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;
}

我想将4字节转换为整数。不是将单个字节转换为整数。该文件是整数文件。 - alessandro
@alessandro:你是说你想让数组的每4个字节表示一个整数? - Chris Dargis
&0xFF 结合使用的作用是什么? - weima
使用0xFF(十进制:255,二进制:11111111)与&结合的方法是从字节数组创建整数数组的小端方法。 - Caffeine Coder
@weima 位运算符&的作用是防止所谓的“算术转换”。通常情况下,当进行强制类型转换(int) someByte时,它会保持符号,因此负数保持不变。这意味着如果字节的最前面有一个1,它将一直重复到整数的前面。位运算符&可以防止这种情况发生。我在 Pastebin 上有一个小的Java代码片段来展示其功能。如果您想要更多信息,请查找“二进制补码”。 - Christoph Fischer

2

在Java中:

  • byte = 8位
  • integer = 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]

1
这对您来说可以吗?
    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<maxOrg; i++){
            // Copia o int, byte a byte.
            arrayDst[idxDst] = (byte)(arrayOrg[i]);
            idxDst++;
            arrayDst[idxDst] = (byte)(arrayOrg[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<maxDst; i++){
            arrayDst[i] = 0;
            //
            v = 0x000000FF & arrayOrg[idxOrg];
            arrayDst[i] = arrayDst[i] | v;
            idxOrg++;
            //
            v = 0x000000FF & arrayOrg[idxOrg];
            arrayDst[i] = arrayDst[i] | (v << 8);
            idxOrg++;
            //
            v = 0x000000FF & arrayOrg[idxOrg];
            arrayDst[i] = arrayDst[i] | (v << 16);
            idxOrg++;
            //
            v = 0x000000FF & arrayOrg[idxOrg];
            arrayDst[i] = arrayDst[i] | (v << 24);
            idxOrg++;
        }
        //
        return maxDst;
    }

0

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

小端字节序源字节:

    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;
        }
    }

对于大端字节序,请替换此行:

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

0

0
创建一个新的int数组,并复制值,根据需要进行类型转换。
int[] arr = new int[len];

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接