Ich schreibe Code, die Nachrichten erstellen über einen CANBUS mit einem bestimmten Protokoll gesendet werden. Ein beispielhaftes Format für ein Datenfeld einer solchen Nachricht ist:Konvertieren von Binär in Bytearray mit 8-Bit-Codierung
[FROM_ADDRESS (1 Byte)] [control_byte (1 Byte)] [Identifikator (3 Byte)] [Länge (3 Byte)]
The Das Datenfeld muss als Liste oder Bytearray formatiert sein. Mein Code zur Zeit geschieht Folgendes:
data = dataFormat((from_address << 56)|(control_byte << 48)|(identifier << 24)|(length))
wo dataformat wie folgt definiert ist:
def dataFormat(num):
intermediary = BitArray(bin(num))
return bytearray(intermediary.bytes)
Dies tut genau das, was ich will es, außer wenn from_address eine Zahl, die in weniger beschrieben werden kann als 8 Bits. In diesen Fällen bin()
einen binäre von Zeichenlänge nicht durch 8 teilbar (Fremd Nullen werden verworfen) gibt, und intermediary.bytes
beschwert, so dass die Umwandlung ist nicht eindeutig:
InterpretError: Cannot interpret as bytes unambiguously - not multiple of 8 bits.
Ich bin nicht zu irgendetwas in dem obigen Code gebunden - jeder Methode, eine Folge von ganzen Zahlen zu nehmen und es in ein Bytearray (mit korrekter Größe in Bytes) zu konvertieren, würde sehr geschätzt werden.
Wozu braucht es das Tag [tag: can]? – usr2564301
@RadLexus ist Teil einer Can-Nachricht. für das vorliegende Problem nicht besonders relevant, nehme ich an. – oirectine
Warum verwenden Sie nicht die Nachrichtenstruktur der Register Ihres CAN-Controllers? Kennung und Länge sind dedizierte Felder des CAN-Rahmens, während diese anderen Dinge im Datenfeld gespeichert werden müssen. – Lundin