2016-09-07 19 views
1

リトルエンディアンのDWORDバイト配列の符号なしの値が必要です。DWORDバイト配列を符号なしの長整数に変換する

これは私が書いたものである:

private long getUnsignedInt(byte[] data) { 
     long result = 0; 
     for (int i = 0; i < data.length; i++) { 
      result += (data[i] & 0xFF) << 8 * (data.length - 1 - i); 
     } 
     return result; 
} 

はそれが正しいですか?

+0

期待する価値がありますか? – Kayaman

+0

私がテストしたところでは、これは「2の補完」であるかどうかわかりません。 – Tobia

+0

素晴らしいdownvoter、多分私はコードを投稿するべきではなく、質問のみ? – Tobia

答えて

2

いいえ私はビッグエンディアンであるとは思いません。

public long readUInt(byte[] data) { 
    // If you want to tackle different lengths for little endian: 
    //data = Arrays.copyOf(data, 4); 
    return ByteBuffer.wrap(data) 
     .order(ByteOrder.LITTLE_ENDIAN) 
     .getInt() & 0xFF_FF_FF_FFL; 
} 

上記は4バイトの(符号付き)int変換を行い、符号なしにします。

1

BIGENDIANためCorreted

DWORDによってあなたは32ビット符号なし整数を意味する場合は、してみてください。この

public long readUInt(byte[] data) { 
      return (
       ((long)(data[3] & 0xFF) << 24) | 
       ((long)(data[2] & 0xFF) << 16) | 
       ((long)(data[1] & 0xFF) << 8) | 
       ((long)(data[0] & 0xFF) << 0)); 
    } 

ジョープEggenの答えは、私は何のオブジェクトが存在しないとして、この1が高速であると考え、正しいです割り当て。

+0

ありがとうございました、変数のバイト長に柔軟性を持たせたかったのでループを書いていました。おそらく長さを超えないようにチェックする必要があります。 – Tobia

+0

Joopも[彼の答え](http://stackoverflow.com/a/39374621/5221149)に言及しているように、これはリトルエンディアンではなく、ビッグエンディアンです。 – Andreas

+1

はいシフト値を反転する必要があります – Tobia

関連する問題