Я получаю «BufferUnderflowException» при попытке преобразовать byteArray в ByteBuffer и затем обратно. Кажется, все идет хорошо, пока я не собираюсь превратить ByteBuffer обратно в byteArray, тогда я получаю исключение. По тому, что я вижу, длина массива и буфера всегда одинакова. Что я делаю не так?
Я пытаюсь преобразовать UUID Bluetooth из байтов с прямым порядком байтов в байты с прямым порядком байтов (все UUID, которые я получаю, меняются местами). Формат является стандартным форматом Bluetooth UUID, например:
"00001800-0000-1000-8000-00805f9b34fb"
public static String getLittleEndianFromBigEndian(String bigEndianString){
String littleEndianString = "";
try {
Log.d(TAG,"getLittleEndianFromBigEndian");
ArrayList<Integer> dashIndex = new ArrayList<>();
while (bigEndianString.contains("-")) {
dashIndex.add(bigEndianString.indexOf("-"));
bigEndianString = bigEndianString.replaceFirst("-", "");
}
int stringLength = bigEndianString.length();
Log.d(TAG, "bigEndian: " + bigEndianString + ", length: " + stringLength);
byte[] byteArray = new byte[stringLength / 2];
for (int i = 0; i < byteArray.length; i++) {
int index = i * 2;
int hexInt = Integer.parseInt(bigEndianString.substring(index, index + 2), 16);
byteArray[i] = (byte) hexInt;
}
Log.d(TAG,"byteArray length: " + byteArray.length);
ByteBuffer convertBuffer = ByteBuffer.allocate(byteArray.length);
convertBuffer.order(ByteOrder.BIG_ENDIAN);
convertBuffer.put(byteArray);
convertBuffer.order(ByteOrder.LITTLE_ENDIAN);
convertBuffer.get(byteArray, 0, byteArray.length);
StringBuffer hexStringBuffer = new StringBuffer();
for (int i = 0; i < byteArray.length; i++) {
hexStringBuffer.append(Integer.toHexString(byteArray[i]));
if (dashIndex.contains(byteArray.length - i)) {
hexStringBuffer.append("-");
}
}
littleEndianString = hexStringBuffer.toString();
Log.d(TAG, "littleEndian: " + littleEndianString);
}catch (Exception e){
e.printStackTrace();
}
return littleEndianString;
}
Исключение происходит в строке "convertBuffer.get (byteArray, 0, byteArray.length);"
Вот трассировка стека исключения:
W/System.err: java.nio.BufferUnderflowException
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:123)
at com.qtatracersystem.ap.Utils.getLittleEndianFromBigEndian(Utils.java:110)
W/System.err: at com.qtatracersystem.ap.ReadActivity$1.uiAvailableServices(ReadActivity.java:299)
W/System.err: at com.qtatracersystem.ap.ble.BleWrapper.getSupportedServices(BleWrapper.java:228)
at com.qtatracersystem.ap.ble.BleWrapper$3.onServicesDiscovered(BleWrapper.java:414)
at android.bluetooth.BluetoothGatt$1$5.run(BluetoothGatt.java:330)
at android.bluetooth.BluetoothGatt.runOrQueueCallback(BluetoothGatt.java:789)
W/System.err: at android.bluetooth.BluetoothGatt.-wrap0(Unknown Source:0)
at android.bluetooth.BluetoothGatt$1.onSearchComplete(BluetoothGatt.java:326)
at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:110)
at android.os.Binder.execTransact(Binder.java:682)