Автоматическое преобразование между подписанным и неподписанным байтами?

Я работаю с роботом Scribbler 2 и платой Fluke 2 и общаюсь с Fluke через Myro в Java. Плата Fluke - это коммуникационный мост Bluetooth между Scribbler и клиентом для настольного компьютера, написанным на Java. Он связывается через последовательный порт RS232 с Scribbler.

Это может быть глупый вопрос, и вышеуказанная система сложна, так что терпите меня, если я не объясню это хорошо.

Предыстория моего вопроса: Java использует подписанные байты. Fluke (я думаю) написан на C, так что он использует неподписанные байты. Прошивка на Scribbler написана на Spin, которая также использует неподписанные байты. Некоторые из командных байт-кодов для микропрограммного обеспечения Scribbler используют значения, превышающие 127, поэтому при отправке из моего клиента Java они отправляются в виде отрицательных чисел. Робот не отвечает на эти> 127 команд, и я пытаюсь понять, почему.

Суть моего вопроса: если я отправляю 162 с Java, он отображается как -94 (это видно на моей консоли с "print"). Будет ли прошивка Spin видеть это как 162, потому что байт является байтом, или он будет видеть это как что-то еще?

Я знаю, что Spin-код немного сдвигает биты параметров в команды перемещения, которые могут быть больше 255, но он не делает это для конкретной команды.

pub Move | x_coord, y_coord
'        0    1     2      3      4      5 
'Format 162 type hXByte lXByte hYByte lYByte
'  type    := indata[1]
  x_coord := (indata[2]<<8 | indata[3])
  y_coord := (indata[4]<<8 | indata[5])

1 ответ

Решение

Байт 8 бит, и больше ничего. Он не подписан или не подписан сам по себе. Это арифметические операции, которые имеют значение - просто потому, что есть разные арифметические операции. Так что в Java есть только целочисленные операции со знаком, а в C - оба. Пока байт отправляется через RS232, он не выполняет никаких операций. Так что не волнуйтесь, ваши байты не будут испорчены Java.

Биты в байте со знаком совпадают с битами в байте без знака, это просто вопрос интерпретации для таких операторов, как математика и отображение. Если вы отправите неподписанный байт, который был изменен на подписанный байт, в прошивку Spin, которая обрабатывает его как неподписанный байт, значение будет таким же. Чтобы выполнить математику для байтов без знака, довольно распространенным является преобразование их значения в тип int, который имеет достаточный диапазон со знаком, чтобы содержать байт без знака. Не спрашивайте меня, что делать с неподписанным длинным;)

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