Я пишу код, который создает сообщения, отправляемые через CANBUS с использованием определенного протокола. Пример формата для поля данных такого сообщения является:Преобразование двоичных данных в bytearray с 8-битным кодированием
[FROM_ADDRESS (1 байт)] [control_byte (1 байт)] [идентификатор (3 байта)] [длина (3 байта)]
поле данных должно быть отформатировано как список или bytearray. Мой код в настоящее время выполняет следующие действия:
data = dataFormat((from_address << 56)|(control_byte << 48)|(identifier << 24)|(length))
где DataFormat определяются следующим образом:
def dataFormat(num):
intermediary = BitArray(bin(num))
return bytearray(intermediary.bytes)
Это именно то, что я хочу его, за исключением случаев, когда FROM_ADDRESS этого числа, которое может быть описано в менее чем 8 бит. В этих случаях bin()
возвращает двоичную длину символа не делится на 8 (посторонние нули отбрасываются), и поэтому intermediary.bytes
жалуется, что преобразование неоднозначно:
InterpretError: Cannot interpret as bytes unambiguously - not multiple of 8 bits.
Я не привязан ни к чему в коде выше - любой был бы очень полезен метод для принятия последовательности целых чисел и преобразования его в bytearray (с правильной оценкой в байтах).
Для чего нужен тег [tag: can] для? – usr2564301
@RadLexus это часть сообщения can. я не думаю, что это не имеет особого отношения к проблеме. – oirectine
Почему бы не использовать структуру сообщений ваших регистров контроллера CAN? Идентификатор и длина являются выделенными полями кадра CAN, тогда как другие данные должны храниться в поле данных. – Lundin