Ошибка при попытке превратить ByteByffer обратно в byteArray при переключении порядкового номера Bluetooth UUID - PullRequest
0 голосов
/ 21 января 2019

Я получаю «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)

1 Ответ

0 голосов
/ 22 января 2019

В итоге я решил эту проблему, просто перевернув byteArray вручную вместо использования ByteBuffer, но я оставлю этот вопрос открытым, чтобы, если кто-то, кто знает ответ на этот вопрос, мог на самом деле решить его, используя буфер.Вот мое решение (заменяет строки между

Log.d(TAG, "bigEndian: " + bigEndianString + ", length: " + stringLength); 

и

StringBuffer hexStringBuffer = new StringBuffer(); 

):

byte[] byteArray = new byte[stringLength / 2];
        int arrayLength = byteArray.length;
        for (int i = 0; i < arrayLength; i++) {
            int index = i * 2;
            int hexInt = Integer.parseInt(bigEndianString.substring(index, index + 2), 16);
            byteArray[arrayLength-(i+1)] = (byte) hexInt;
        }
        Log.d(TAG,"byteArray length: " + arrayLength);


//        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);
...