18

私は以下を使用してファイルを読んでいます:

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 ArrayInt Array、かなり多くのスペースが必要になりますか?

編集:私のファイルには、次のような何百万ものintが含まれています

100000000 200000000 .....(通常のintファイルwirteを使用して記述)。バイトバッファに読み込みました。次に、それをIntBuffer配列にラップします。どうやってするか ?各バイトをintに変換したくありません。

4

7 に答える 7

49

コメントで、入力配列の4バイトを出力配列の1つの整数に対応させたいとおっしゃっていましたが、これはうまく機能します。

バイトがビッグエンディアンまたはリトルエンディアンのどちらの順序であるかによって異なりますが、...

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

3行で完了。

于 2012-07-11T17:24:33.397 に答える
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;
}
于 2012-07-11T16:36:04.000 に答える
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;
    }
于 2013-10-08T15:36:02.073 に答える
0

新しいint配列を作成し、値をコピーして、必要に応じてキャストします。

int[] arr = new int[len];

for(int i = 0; i < len; i++)
    arr[i] = (int)buf[i];
于 2012-07-11T16:35:54.593 に答える
0

「大幅に」定義します。Javaでは、intは4バイトであるため、定義上、配列はスペースの4倍になります。参照:http ://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

また、変換時には両方が必要になるため、コピー部分では、配列全体を一度にコピーする場合は、さらに多くを使用することになります。

変換に関しては、多くの関連する質問があります。

Java-オーディオのバイト配列を整数配列に変換する

于 2012-07-11T16:35:58.780 に答える
0

Javaの場合:

  • バイト=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]
于 2012-07-11T16:44:43.757 に答える
0

バイトの配列を整数の配列に変換するためのソリューション。4バイトの各セットは整数を表します。バイト入力はbyte[] srcByteです。int出力は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
于 2018-08-02T16:14:16.897 に答える