私は使用してファイルを読んでいます:
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
に変換すると、かなり多くのスペースが必要になりますか?
編集:私のファイルには、何百万ものintが含まれています、
100000000 200000000 .....(通常のintファイルwirteを使用して書き込まれます)。バイトバッファに読み込みます。次に、それをIntBuffer配列にラップします。どうやってするか ?各バイトをintに変換したくありません。
コメントで、入力配列の4バイトを出力配列の1つの整数に対応させたいので、うまくいきます。
バイトがビッグエンディアン順かリトルエンディアン順かを予想しますが、...
IntBuffer intBuf =
ByteBuffer.wrap(byteArray)
.order(ByteOrder.BIG_ENDIAN)
.asIntBuffer();
int[] array = new int[intBuf.remaining()];
intBuf.get(array);
3行で完了しました。
バイト配列の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バイトの各セットは整数を表します。バイト入力は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
よろしいですか?
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;
}
Javaの場合:
そして変換のためにあなたは次のようなことをすることができます:
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
配列を作成し、必要に応じてキャストして値をコピーします。
int[] arr = new int[len];
for(int i = 0; i < len; i++)
arr[i] = (int)buf[i];
「大幅に」定義します。 Javaでは、intは4バイトなので、配列は定義により4倍のスペースになります。参照: http://docs.Oracle.com/javase/tutorial/Java/nutsandbolts/datatypes.html
また、変換時には両方が必要になるため、一度に配列全体をコピーする場合は、コピー部分でさらに使用することになります。
変換に関しては、多くの関連する質問があります: