如果字节值增加为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音频位流中的颗粒位置以这种方式存储。我正在尝试组合两个比特流,我必须做这样的补充。
答案 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;遗漏除外。