Преобразование шестнадцатеричной строки большего значения в байты с использованием Java

Я пытаюсь преобразовать большее значение шестнадцатеричной строки в байты. Информация, которая получается о преобразовании подписанных байтов, составляет максимум 0x7F, равный только 127. Но теперь я хочу преобразовать шестнадцатеричное значение C6 в байты, которые я должен получить 198. Есть ли способы сделать это?

В настоящее время я проверил свой код, используя следующие методы:

  1. static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)(Integer.parseInt("C6",16) & 0xff), 0x1B};
  2. static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)0xC6, 0x1B};

Весь этот метод дает мне одинаковое значение только -58.

Я ценю, если кто-то может помочь мне с этим. Спасибо

2 ответа

Решение

Используйте метод 2 и не беспокойтесь об отрицательных значениях в вашем байтовом массиве. Байты подписаны в Java, поэтому, если вы хотите обработать свои байты от 0 до 255 вместо от -128 до 127, И каждый байт против 0xFF. Это повысит байт до целого числа и будет иметь значение от 0 до 255.

ОБНОВИТЬ

Видя комментарий о том, как вы собираетесь отправлять это через последовательный порт, нет ничего плохого в вашем байтовом массиве. Получатель (если это другая Java-программа) должен будет обработать байты, сравнив их с 0xFF. Другая последовательная программа (например, в C#) получит байты (0x00 - 0xFF)

public static void main(String[] args) throws Exception {
    byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)0xC6, 0x1B};
    for (byte b : bytearray) {
        System.out.printf("%d ", b);
    }
    System.out.println();

    for (byte b : bytearray) {
        System.out.printf("%d ", b & 0xFF);
    }
}

Выход:

2 8 22 0 0 51 -58 27 
2 8 22 0 0 51 198 27 

OLD

public static void main(String[] args) throws Exception {
    System.out.println(Byte.MIN_VALUE);
    System.out.println(Byte.MAX_VALUE);

    System.out.println(Byte.MIN_VALUE & 0xFF);
    System.out.println((byte)-1 & 0xFF);
    System.out.println((byte)-10 & 0xFF);
    System.out.println((byte)-58 & 0xFF);
}

Выход:

-128
127
128
255
246
198

Это правильно, потому что байты подписаны в Java. Если вам нужно от 0 до 255 вместо от -128 до 127, вы должны использовать short или int (или long, я полагаю).

При этом вы все равно можете отправить его в этом формате, но когда вы используете его, вам нужно будет использовать его как int. В противном случае вы получите отрицательные числа навсегда.

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