Android Bluetooth и отправка неподписанного шестнадцатеричного значения

В настоящее время я работаю над приложением для Android, которое берет значения из текстового поля, а затем отправляет его через Bluetooth, все операции выполняются в шестнадцатеричных значениях.

У меня есть метод преобразования, который может взять строку. Make дает мне целое число без знака для строки, но как только я помещаю его в массив байтов, он становится подписанным, и доска, которая получает это, не может делать шестнадцатеричный знак.

Вот как работает этот процесс:

//sample string to send
String toSend = "0BDD";

//sending the byte[] to the board over bluetooth
btOutputStream.write(SendByteData(toSend));

// --- perform the conversion to byte[] ---
public static byte[] SendByteData(String hexString)
{
    byte[] sendingThisByteArray = new byte[hexString.length()/2];
    int count  = 0;

    for( int i = 0; i < hexString.length() - 1; i += 2 )
    {
        //grab the hex in pairs
        String output = hexString.substring(i, (i + 2));

        //convert the 2 characters in the 'output' string to the hex number
        int decimal = (int)(Integer.parseInt(output, 16)) ;

        //place into array for sending
        sendingThisByteArray[count] =  (byte)(decimal);

        Log.d(TAG, "in byte array = " + sendingThisByteArray[count]);
        count ++;
    }

    return sendingThisByteArray;
}

Проблема заключается в следующем: когда цикл for проходит через строку и выбирает "0B", он правильно дает мне целое число 11; затем, когда цикл проходит через "DD", он дает мне целое число 221, что также правильно

Когда я выполняю операцию

sendingThisByteArray[count] =  (byte)(decimal);

11 правильно помещается в sendThisByteArray[0], но для sendThisByteArray[1] число 221 изменяется на -35

Я знаю, что у Java есть подписанные байты. Есть ли способ поместить / поместить / изменить байтовый массив, чтобы я мог разместить и число 221 или любое другое значение больше 127?

Ваша помощь очень ценится

2 ответа

Вы можете преобразовать целое число со знаком в беззнаковый байт, например, с помощью двоичного И, добавив в него 0xFF:

sendingThisByteArray[count] =  (byte)(decimal & 0xFF);

Таким образом, вы можете отправлять значения от 0 до 255

Я обнаружил проблему, когда я пытался сделать неподписанный шестнадцатеричный в массив байтов, он всегда ставил знак, я должен был создать один байт, чтобы сохранить неподписанный шестнадцатеричный

int zeroA = (int)(Integer.parseInt("0D", 16)); sendStream.write(unsignedToBytes((byte) zeroA));

Другие вопросы по тегам