Преобразование шестнадцатеричной строки большего значения в байты с использованием Java
Я пытаюсь преобразовать большее значение шестнадцатеричной строки в байты. Информация, которая получается о преобразовании подписанных байтов, составляет максимум 0x7F, равный только 127. Но теперь я хочу преобразовать шестнадцатеричное значение C6 в байты, которые я должен получить 198. Есть ли способы сделать это?
В настоящее время я проверил свой код, используя следующие методы:
static byte[] bytearray = {0x02, 0x08, 0x16, 0x00, 0x00, 0x33, (byte)(Integer.parseInt("C6",16) & 0xff), 0x1B};
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. В противном случае вы получите отрицательные числа навсегда.