8バイトの配列があり、対応する数値に変換したいと思います。
例えば
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
上記の変換操作を実行するメソッドが必要です。
8バイトの配列があり、対応する数値に変換したいと思います。
例えば
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
上記の変換操作を実行するメソッドが必要です。
new BigInteger(by).longValue()
回答:
最初のバイトが最下位バイトであると仮定します:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value += ((long) by[i] & 0xffL) << (8 * i);
}
最初のバイトが最も重要で、次に少し異なります:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value = (value << 8) + (by[i] & 0xff);
}
8バイトを超える場合は、longをBigIntegerに置き換えます。
私のエラーを修正してくれたAaron Digullaに感謝します。
value += ((long)by[i] & 0xffL) << (8 * i);
パッケージのBuffer
一部として提供されているを使用java.nio
して、変換を実行できます。
ここで、ソースbyte[]
配列の長さは8であり、これはlong
値に対応するサイズです。
最初に、byte[]
配列がでラップされ、ByteBuffer
次にByteBuffer.getLong
メソッドが呼び出されてlong
値を取得します。
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();
System.out.println(l);
結果
4
ByteBuffer.getLong
コメントでメソッドを指摘してくれたdfaに感謝します。
この状況では適用できない場合もありますが、Buffer
sの優れた点は、複数の値を持つ配列を見ることです。
たとえば、8バイトの配列があり、それを2つのint
値として表示したい場合は、byte[]
配列をにラップしてByteBuffer
、として表示し、次IntBuffer
の方法で値を取得できますIntBuffer.get
。
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);
System.out.println(i0);
System.out.println(i1);
結果:
1
4
これが8バイトの数値の場合、次のことを試すことができます。
BigInteger n = new BigInteger(byteArray);
これがUTF-8文字バッファーの場合、次のことを試すことができます。
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
単純に、あなたが使用したり、参照できグアバ libに長いとバイト配列との間の変換のためのutiliy方法を提供していますグーグルが提供します。私のクライアントコード:
long content = 212000607777l;
byte[] numberByte = Longs.toByteArray(content);
logger.info(Longs.fromByteArray(numberByte));
配列との間のすべてのプリミティブ型の完全なJavaコンバーターコード http://www.daniweb.com/code/snippet216874.html
配列内の各セルはunsigned intとして扱われます。
private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
return res;
for (int i=0;i<bytes.length;i++){
res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}