2015-05-22 3 views
0

Вот проблема, мне нужно сделать это в Java: Мне нужно создать массив байтов с шестнадцатеричными значениями, чтобы отправить через сокет на устройство. Формат сообщения что-то вроде этогоСоздание шестнадцатеричного байтового массива в java

STX CMD1 arg1, cmd2 ETX контрольной суммы // Любое количество команд и аргументов

Пример: STX А 1 ETX 148 // 1 и 148 находятся в десятичной STX 0x02, а ETX - 0x03, а не текст STX и ETX.

Массив байтов, который должен быть создан для приведенного выше примера заключается в следующем:

STX   A   1   ETX   148 
{(byte)0x2,(byte)0x41,(byte)0x31,(byte)0x3, (byte)0x94} 

Можете ли вы мне помочь. Как мне преобразовать эти числа/символы и назначить массив байтов?

+2

Что? 'byte [] buffer = {(byte) 0x2, (byte) 0x41, (byte) 0x31, (byte) 0x3, (byte) 0x94};' –

+0

@SotiriosDelimanolis Спасибо, как конвертировать Ato 0x41, 148 в 0x94 и назначить вопрос к массиву байтов. один приведенный пример. STX и ETX, но A и 1 будут отличаться. – user3124284

+0

Что вы вводите? –

ответ

1

Если я ошибаюсь, вы уже направляетесь в правильном направлении.

Несколько вещей, которые нужно знать, байты без знака идут от 0 до 255 (от 0x00 до 0xFF). В Java существуют только подписанные типы данных, а байты - от -128 до +127.

System.out.println(Byte.MIN_VALUE); // -128 
System.out.println(Byte.MAX_VALUE); // +127 

Если поля 3 & 5 является int s литейных их byte s хорошо, но знает, что все, что находится над +127, когда отливает в байты будут переливаться в отрицательный диапазон.

System.out.println((byte)0x94); // -108 
System.out.println((byte)148); // -108 

Если Вы желаете фактическое положительное значение байта вы можете AND каждый байт против 0xFF.

System.out.println(((byte)-108) & 0xFF); // +148 
System.out.println(((byte)-1) & 0xFF); // +255 
+0

Большое спасибо за ваш комментарий. С вашим ответом я близок к решению, Только одна проблема. Может быть, если я получу ответ на этот запрос, я могу достичь цели. Shouldnt System.out.println ((byte) 0x31) и System.out.println ((byte) 1) печатать тот же ответ 49?Я получаю 49 для первого и 1 для второго. Вот где я сейчас застрял. Если мое третье значение поля равно 1, я ожидаю 49 (0x31), но я получаю 1 (0x1) – user3124284

+0

@ Shar1e80, у меня возникла проблема. Путаница между 1 и 1. Ваше объяснение действительно помогло мне. большое спасибо – user3124284

0

Не могли бы вы использовать то, что Sotirios Delimanolis предложил в комментариях и поместил ваши переменные char там?

char a = 'A'; 
char b = '1'; 
byte[] buffer = {(byte)0x2, (byte)a, (byte)b, (byte)0x3, (byte)0x94}; 

Или я что-то упустил?

+0

thankyou, тот, который вы указали, будет работать, но проблема в том, что b является целым числом, это может быть два или три цифры. Если я назначу char b = 1 без кавычек (''), он будет равен 0x1, а не 0x31. В вопросе 148 должно быть заполнено как 0x94, динамически - оно не жестко закодировано. – user3124284

Смежные вопросы