Преобразование шестнадцатеричной строки в байтовую java

У меня проблема, потому что при использовании метода getBytes() java, конечно, преобразует HEX-код в ASCI, который не подходит, я хочу получить массив с байтами, например:

[01, 00, 0A, 02, 00, 00, ....., 28, 72];

Мой код:

  byte array[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x72, (byte) 0x28 };

            Log.v("OUTPUT BYTE", Arrays.toString(array.getBytes()));

Текущий результат:

[48, 49, 48, 48, 48, 97, 48, 50, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 50, 50, 56]

Мне нужны байты HEX в массиве.

«Мне нужны байты HEX в массиве». Не существует такого понятия, как «шестнадцатеричный байт». Там просто байт. Однако ваш код не показывает, откуда вы получаете data, и ваш оператор журнала вообще не использует array3. Похоже, вы здесь упустили целую кучу контекста.

Jon Skeet 11.04.2018 13:21

Модуль ESP принимает такую ​​команду: 01 00 0a 02 00 00 00 00 00 00 00 00 00 00 00 00 72 28 в виде байтов, но без преобразования в ASCI, потому что он получает только HEX с отдельными байтами.

noname 11.04.2018 13:30

Что именно вы имеете в виду под «он получает только HEX с отдельными байтами»? Если он получает его как байтовый массив, нет такой вещи, как «получает только HEX» - он просто получает байты. Код, который вы сейчас получили в своем вопросе, не будет компилироваться, поскольку массив байтов не имеет метода getBytes. Я предполагаю, что где-то задействована строка, но вы не показали, где.

Jon Skeet 11.04.2018 16:35

Вы получаете байты как байты или как текст? Что это за метод getBytes? Байт состоит всего из 8 бит, поэтому внутренне он всегда двоичный, но вам не о чем беспокоиться. Вы всегда можете снова распечатать байты в шестнадцатеричном формате, когда вам нужно.

Ole V.V. 11.04.2018 16:47
0
4
538
3

Ответы 3

Попробуйте приведенный ниже код, он отлично работает:

byte array3[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x72, (byte) 0x28 };

        Log.v("OUTPUT BYTE", Arrays.toString(data));

Теперь он конвертируется в код ASCI, но должен оставаться таким же кодом [01, 00, 0A ..., 27, 72] .... 72 шестнадцатеричный код равен 114 ASCI, но, конечно, датчик ESP получает эту команду, как было сказано ранее.

noname 11.04.2018 13:28
byte[] data = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0,
    (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
    (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x72, (byte) 0x28 };

StringBuilder sb = new StringBuilder(data.length * 4 + 2);
sb.append('[');
for (byte b : data) {
    sb.append(String.format("%02X, ", 0xFF & b));
}
if (data.length != 0) {
    sb = sb.setLength(sb.length() - 2);
}
sb.append(']');
Log.v("OUTPUT_BYTE, sb.toString());

%02X даст заглавные шестнадцатеричные цифры, %02x - маленькие шестнадцатеричные цифры, оба дополненные нулями. Поскольку байты подписаны, (byte)0x80 фактически равен -128, поэтому нужно использовать int, замаскированный байтом: 0xFF & b.

Добавление хорошей начальной емкости к StringBuilder означает меньшее перераспределение памяти при добавлении.

Образец кода:

package com.test;

import java.util.Arrays;

public class Hexa {

    public static void main(String[] args) {
        byte array3[] = { (byte) 0x1, (byte) 0x0, (byte) 0x0A, (byte) 0x02, (byte) 0x0, (byte) 0x0, (byte) 0x0,
                (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
                (byte) 0x0, (byte) 0x72, (byte) 0x28 };

        String[] hexArray = new String[array3.length];
        for (int i = 0; i < array3.length; i++) {
            hexArray[i] = String.format("%02X ", array3[i]);
        }

        System.out.println(Arrays.asList(hexArray));
    }

}

Выход:

[01 , 00 , 0A , 02 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 72 , 28 ]

Тип hexArray должен быть Byte, а не String, потому что запись TCP использует Byte в качестве входного параметра.

noname 11.04.2018 13:43

@noname неверный ответ в порядке; array3 - это входной параметр, а hexArray - вспомогательная переменная для Arrays.toString / asList.

Joop Eggen 11.04.2018 13:46

array3 по-прежнему преобразуется в символы ASCI, что неверно ...: V / INPUT STRING: 01000a020000000000000000000000007228 V / INPUT BYTE: [1, 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 114, 40]

noname 11.04.2018 13:57

Тип примитива Java byte представляет собой целое число от -128 до 127, тогда как HEX - это строки, содержащие числа, символы и ведущие нули. Поэтому я думаю, что тип данных byte [] не сможет хранить HEX-строки.

Amitabha Roy 11.04.2018 14:25

Единственный вариант - отправлять данные как ASCI, а затем преобразовывать ESP в HEX, а также возвращать результат как ASCI?

noname 11.04.2018 16:12

В качестве вывода я нашел что-то: V / OUTPUT BYTE: [1, 0, 10, 2, 66, 72, -52, -51, 66, -58, 0, 0, 65, -72, 0, 0, - 113, 27], теперь что мне нужно сделать, если его отрицательное значение мне нужно отсчитывать от 256, например 256 - 52 = 204, что является CC в HEX и является правильным значением ... как мне исправить это в массиве байтов?

noname 11.04.2018 23:48

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