Представление шестнадцатеричной строки в виде отдельных числовых значений?

#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(...) отдельные строки к нему.