2017-06-28 2 views
0

バイト値が0-127に増加すると-128が0になり、次の有効ビットが増加します。 8バイトの数字を2つ追加するにはどうしたらいいですか?byte []配列に格納された2つの8バイト数を追加する方法

byte[] array = {(byte) (0), (byte) (0), (byte) (0), (byte) (0), (byte) (0), (byte) (0), (byte) (0), (byte) (0)}; 
byte[] incrementedarray = byteIncrement(array); 
for(int k=1;k<=5823;k++) { // 5824 samples for 1st page 
     incrementedarray = byteIncrement(incrementedarray); 
} 

:私はこのバイト配列を5284回インクリメントするとき

public static byte[] byteIncrement(byte[] array) { 
    byte[] r = array.clone(); 
    for (int i = array.length - 1; i >= 0; i--) { // LSB to MSB 
     byte x = array[ i ]; 
     if (x == -1) 
      continue; 
     r[ i ] = (byte) (x + 1); 
     Arrays.fill(r, i + 1, array.length, (byte) 0); 
     return r; 
    } 
    throw new IllegalArgumentException(Arrays.toString(array)); 
} 

は、例えば、私は5824個のサンプルの上に与えられた値を取得:

5824 samples = 0 0 0 0 0 0 22 -64 
6272 samples = 0 0 0 0 0 0 24 -128 
----------------------------------- 
12096 samples = 0 0 0 0 0 0 47 64 

5824 samples + 6272 samples = 12096 samples 

私はこのコードを使用してバイト配列をインクリメントしていだから私の質問は、上記のように8バイト(64ビット)の数字を追加する方法です。 OGGオーディオビットストリームのグラニュール位置がこのように格納されるため、バイト配列を使用しています。私はそのような追加を行う必要がある2つのビットストリームを結合しようとしています。

+2

なぜ8バイトの配列の代わりに 'long'sを使うだけでなく、 –

+0

または、バイト配列をlongに変換し、addを実行し、実際にこれらのバイト配列が必要な場合は、それを元に戻します。 – EJP

+0

私は上記のようなバイト配列で格納されたエンコードされたデータを持っています。 longに変換する方法はありますか?操作を行い、変換して戻しますか? – Ali

答えて

1

あなたのコードは意味を持ちません。あなたは手書きそれを行う必要がある場合は、キャリーに対処する必要があります。&不作為は除外

public static byte[] add(byte[] array1, byte[] array2) { 
    byte[] r = new byte[array1.length]; // assuming both arrays are same length 
    int carry = 0; 
    for (int i = array.length - 1; i >= 0; i--) { // LSB to MSB 
     int sum = (array1[i] & 0xff)+(array2[i] & 0xff)+carry; 
     r[i] = (byte) sum; 
     carry = sum >>> 8; 
    } 
    return r; 
} 

エラー:

public static byte[] byteIncrement(byte[] array) { 
    byte[] r = array.clone(); 
    int carry = 1; // as we are incrementing 
    for (int i = array.length - 1; i >= 0; i--) { // LSB to MSB 
     int sum = (array[i] & 0xff)+carry; 
     r[i] = (byte) sum; 
     carry = sum >>> 8; 
    } 
    return r; 
} 

あなたがする場合は、これらのバイト配列を一緒 2を追加します。

+0

このメソッドに2つの引数を渡す必要はありませんか? – Ali

+0

何かのような2つの引数?それはあなたの方法の署名です。私はそれを変えなかった。 – EJP

+0

私のメソッドは、1バイト配列をインクリメントするためのものです。 2バイト配列を一緒に追加するメソッドが必要です。 – Ali

3

あなたは数学を処理するためにBigIntegerを使用することができます。

public static byte[] add(byte[] arr1, byte[] arr2) { 
    return new BigInteger(arr1).add(new BigInteger(arr2)).toByteArray(); 
} 

結果が特定のサイズにする必要がある場合は、ターゲットサイズで新しい配列にコピーすることができます

private static byte[] leftPad(byte[] arr, int size) { 
    if (arr.length < size) { 
     byte[] padded = new byte[size]; 
     System.arraycopy(arr, 0, padded, size - arr.length, arr.length); 
     return padded; 
    } 
    return arr; 
} 
関連する問題