2010-04-01 7 views
2

Я выполняю некоторую работу с API JavaSound для отправки сообщения MIDI System Exclusive (Sysex) на внешнее MIDI-устройство (электронную клавиатуру). Согласно руководству Yamaha, данные для отправки, чтобы подсвечивать один из ключей, - это серия байтов: F0 43 7F 00 00 03 00 41 F7.Проблема с отправкой байтов размером более 127 в Java Sound's SysexMessage

Согласно JavaDoc на SysexMessage, правильный способ отправки данных для сообщения - setMessage(int status, byte[] data, int length). В этом случае F0 (или 240 десятичных знаков) является статусом, а все остальное - данными, включая F7 (247 десятичный знак) в конце, что указывает на конец сообщения Sysex.

Проблема в том, что байты в Java ограничены диапазоном -128..127, поэтому я не могу отправить F7 в массив байтов. Но JavaDoc для SysexMessage не замечает этого факта, говоря: «Если это сообщение содержит все системные эксклюзивные данные для сообщения, оно должно заканчиваться байтом состояния 0xF7».

Любые предложения по правильному отправке этого финального байта? Я неверно истолковал JavaDoc для SysexMessage?

ответ

3

Вы считаете, что число F7 неверно. В то время как F7 эквивалентен 247, он также равен -9. Но считаете ли вы, что F7 является номером 247 (как неподписанный байт) или быть числом -9 (в качестве подписанного байта), он по-прежнему остается той же самой последовательностью бит 11110111, и когда эта последовательность бит передается по линии на клавиатуре клавиатура может интерпретировать, однако, она нравится.

1

Для этой проблемы вы можете безопасно использовать любое целочисленное значение, меньшее или равное 255 (0xFF) для байта. Причина в том, что, как заявил Джессап, они будут представлены одним и тем же шаблоном бит.

int i = 0xF7; 
byte b = (byte)i;
+0

Is литье необходимо? «байт b = 0xF7;» достаточно, я считаю. – tafa

+1

Всё зависит. Вы можете написать «byte b = 0x7F;», но вы получите ошибку, если попытаетесь скомпилировать «byte b = 0x80;» (возможная потеря точности, найденная: int, требуемый байт). – matsev