#java #android #hex #data-conversion
Вопрос:
Я работаю над приложением BLE-сканера, в котором вещатель BLE отправляет рекламные пакеты для сканирования и отображения приложения. В настоящее время я использую функцию getBytes() в своем коде Android studio для получения данных в виде массива байтов, однако при печати с использованием этой функции она выдает 8 случайных символов букв и цифр, которые каждый раз меняются (неверно).
byte[] packetData = Scanned.getBytes();
Чтобы обеспечить правильную печать, я добавил цикл for, который преобразует массив байтов в шестнадцатеричную строку для удобства чтения.
//conversion to a hex stream from the byte array
for (byte hex : packetData) {
x.append(String.format("X", hex));
}
Я хотел бы взять шестнадцатеричную строку и сохранить каждую из них в массиве следующим образом:
0x02012404FF как [02, 01, 24, 04, FF]
Я попробовал этот код, который я нашел похожим на мой вопрос, но он отображался неправильно.
byte [] data = new byte[PacketLength/2];
for (int i =0;i<PacketLength;i =2){
data[i/2] = (byte) ((Character.digit(x.charAt(i), 16)<< 4) Character.digit(x.charAt(i 1),16));
}
Редактировать:
код:
private ScanCallback leScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
// gets data from the BLE scan for broadcasting packets
ScanRecord Scanned = result.getScanRecord();
String address = btAdapter.getAddress();
//Gets advertised packets in a byte array
byte[] packetData = Scanned.getBytes();
//gtes length of packet data
int PacketLength = packetData.length;
StringBuilder x = new StringBuilder();
String[] data = new String[PacketLength];
//conversion to a hex stream from the byte array
for (byte hex : packetData) {
x.append(String.format("X", hex));
}
for (int i =0;i<PacketLength;i ){
data[i] = String.format("X", packetData[i]);
}
//Filters the scan by nameed device, easily changable
if (new String("SimpleBLEBroadcaster1").equals(result.getDevice().getName())) {
peripheralTextView.append("Device Name: " result.getDevice().getName() " Rssi: " result.getRssi() " Packet length: " PacketLength "n" " Packet Data: " "0x" x "n"); //Prints data for the first broadcaster
X =x;
//Shared Preferences for Broadcaster 1
SharedPreferences.Editor editor= sharedPreferences.edit();
//Allows the advertised data packets to be stored within the app for future use
editor.putString("Data", String.valueOf(X));
RSSI1 = result.getRssi();
editor.putInt("Rssi", RSSI1 );
//commits your edits
editor.commit();
}
//filter for second device (required for my Chip design)
if (new String("SimpleBLEBroadcaster2").equals(result.getDevice().getName())) {
StringBuilder y = new StringBuilder();
y=x; // Changes the Hex stream detected for the second device to a new variable for storage purposes
peripheralTextView.append("Device Name: " result.getDevice().getName() " Rssi: " result.getRssi() " Packet length: " PacketLength "n" " Packet Data: " "0x" y "n");//Prints data for the second broadcaster
Y=y;
//Shared Preferences for Broadcaster 2
SharedPreferences.Editor editor= sharedPreferences.edit();
//Allows the advertised data packets to be stored within the app for future use
editor.putString("Data", String.valueOf(Y));
RSSI2 = result.getRssi();
editor.putInt("Rssi", RSSI2 );
//commits your edits
editor.commit();
}
}
};
Комментарии:
1. Я не совсем уверен, что вы должны делать. Вам нужно преобразовать байты в целые числа или шестнадцатеричные значения в целые числа? Так следует
AB
ли возвращать hex как 171 или как [10,11]?2. Действительно. Недостаточно информации. Если у вас есть поток байтов, то у вас нет шестнадцатеричного потока. И если вам не скажут, сколько байтов будет образовывать числовое значение, вы ничего не сможете сделать. Так что спроси, а потом расскажи нам.
3. Извините за удаление вопроса, я убедился, что точно знаю, что мне нужно, прежде чем продолжить вопрос. Надеюсь, мои правки предоставят более подробную информацию @Thomas
4. В таком случае, почему бы вам не сохранить отдельные строки, которые вы получаете
String.format("X", hex)
? Предполагая, что вы вводите байты, представляющие 0x02012404FF, вы должны получить массив["02", "01", "24", "04", "FF"]
.5. Просто создайте a
List<String>
иadd(...)
отдельные строки к нему.