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