如何添加存储在byte []数组中的两个8字节数字

时间:2017-06-28 23:59:57

标签: java arrays

如果字节值增加为0-127,则-128增加到0,然后下一个有效位递增。如何添加两个8字节数字?

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

我正在使用以下代码递增字节数组:

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 ) );
}

例如,当我将这个字节数组递增5284次时,我得到5824个样本的上面给出的值:

 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);
 }

所以我的问题是,如何以上述方式添加这样的8字节(64位)数字。我正在使用字节数组,因为OGG音频位流中的颗粒位置以这种方式存储。我正在尝试组合两个比特流,我必须做这样的补充。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

你的代码没有任何意义。如果你必须手写,你需要处理随身携带:

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;
}

如果你想添加这些字节数组中的两个在一起

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;
}

错误&amp;遗漏除外。