組み込み開発のためのPython · レッスン 207 / 220
バイト列・エンコード・チェックサム
テキストとバイト列の違い、エンディアン、CRCなどを分けて考えます。
通信で送られるのは文字ではなくバイト列です。文字コード、数値のバイト順、フレーム形式を混同せず、送受信した生データを検査できるようにします。
文字列とバイト列を変換する
文字列は`encode`でバイト列へ、バイト列は`decode`で文字列へ変換し、両側で文字コードを一致させます。任意の機器フレームをUTF-8文字列として扱うと、無効な並びで失敗したり、値が変化したりすることがあります。バイナリプロトコルは`bytes`のまま処理します。
数値の幅・符号・バイト順を決める
複数バイト整数を扱うときは、ビット幅、符号付きかどうか、リトルエンディアンかビッグエンディアンかを仕様で確認します。CRCやチェックサムは方式ごとに多項式・初期値・反転規則が異なり、同じ名称だけでは互換になりません。公式仕様の既知ベクトルで実装を照合します。
コード例
手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。
import struct
value = 0x1234
little = struct.pack("<H", value)
big = struct.pack(">H", value)
assert struct.unpack("<H", little)[0] == value
print(little.hex(), big.hex())
message = "温度"
print(message.encode("utf-8").hex())手を動かす課題
任意の16ビット値を両方のバイト順で符号化し、仕様書にある期待バイト列と一致することを試してください。