特定のプロトコルを使用してCANBUS経由で送信するメッセージを作成するコードを作成しています。このようなメッセージのデータフィールドのフォーマット例である:8bitエンコーディングでバイナリをbytearrayに変換する
[FROM_ADDRESS(1バイト)] [control_byte(1バイト)] [識別子(3バイト)] [長さ(3バイト)]
データフィールドはリストまたはbytearrayとしてフォーマットする必要があります。私のコードは、現在、以下のことを行います。
次のようにのdataFormatが定義されているdata = dataFormat((from_address << 56)|(control_byte << 48)|(identifier << 24)|(length))
:
def dataFormat(num):
intermediary = BitArray(bin(num))
return bytearray(intermediary.bytes)
これはFROM_ADDRESSは以下で説明することができます番号であるときを除いて、私はそれがしたい正確に何ん8ビットより大きい。これらのケースでは(余分なゼロは破棄されます)8で割り切れない文字長のバイナリを返し、そうintermediary.bytes
は、変換があいまいであると文句を言いbin()
:
InterpretError: Cannot interpret as bytes unambiguously - not multiple of 8 bits.
私は上記のコードでは何にも縛られないです - どのメソッドを使用して整数のシーケンスを取得し、バイト単位で正しいサイジングを使用してバイトアレーに変換すると非常に感謝します。
これはタグ[tag:can]が必要なのは何ですか? – usr2564301
@RadLexusこれはcanメッセージの一部です。手元の問題には特に関係ないと思います。 – oirectine
CANコントローラのレジスタのメッセージ構造を使用してみませんか?識別子と長さはCANフレームの専用フィールドですが、他のものはデータフィールドに格納する必要があります。 – Lundin