セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-11-14 現在

parseFmt.py parseFmt_*.py

TWELITE シリアル書式パーサ

    class FmtBase

    書式パーサーの基底クラスで共通手続きを定義する。これを継承した FmtAscii (アスキー形式 ASCII形式), FmtBinary (バイナリ形式 Binary形式) を利用する。

    書式パーサーは、シリアル入力を想定し、アスキー形式の場合は1行単位でバイナリ形式の場合は1バイト単位で入力系列を解釈し、その系列が書式で定義されるヘッダ、フッタ、チェックサムを満足した時、解釈の完了とし、ヘッダ、フッタを除いた内容(ペイロード)を格納する。

    process(c)

    入力文字列の解釈を行う。解釈後は is_complete()true を返した場合、解釈が成功し get_payload() によりペイロードを得ることができる。ペイロードは続く process() 処理などを実行すると内容を保証しないため、解釈終了後に速やかに利用します。

    続けて別の系列を解釈したい場合は、そのまま process() を実行する。

    パラメータ

    パラメータ内容
    c解釈したい入力系列。1バイト単位の解釈と系列単位の解釈の2種類に対応する。1バイト単位の入力では、int型のアスキーコード、str型、bytes型、list型の長さ1の系列。系列単位の入力では list 型、str型、bytes型の1系列を処理する。データに複数系列ある場合や途中で切れている場合は処理できない。

    戻り値

    なし

    is_comp()

    process() 処理後に呼び出し、書式解釈の完了状況を知らせる。true を得た場合は get_peyload() または get_payload_in_str() メソッドにより、ペイロードを取得する。

    パラメータ

    なし

    戻り値

    内容
    true解釈に成功した。ペイロードが利用できる。
    false解釈に失敗した、または、書式の途中である。

    get_payload()

    ペイロードを返す。

    パラメータ

    なし

    戻り値

    ヘッダやフッタが含まれないペイロード部を list型 バイト列として返します。

    reinit()

    明示的に内部を初期状態にします。

    パラメータ

    なし

    戻り値

    なし

    その他メソッド

    内部で利用する目的でいくつかのメソッドが定義されています。詳細はソースコードを参照してください。

    コード例

    系列単位の解釈

    str 型の系列 a を解釈し、pay にペイロード情報保存します。pay には [ 0x78, 0x80, 0x01, ... , 0x00 ] が格納されます。

    import parseFmt_Ascii
    
    fmta=parseFmt_Ascii.FmtAscii()
    a = ':7880010F0F0380030002800200DF'
    pay = []
    
    fmta.process(a)
    
    if fmta.is_comp():
        pay = fmta.get_payload()

    1バイト単位の解釈

    バイナリの系列 b について、1バイトごと process() メソッドにより系列の解釈を進めます。終端の 0x04 を投入した時点で、解釈が完了しペイロードが pay に保管されます。

    import parseFmt_Binary
    
    fmtb=parseFmt_Binary.FmtBinary()
    b = [0xA5, 0x5A, 0x80, 0x05, 0x78, 0x00, 0x11, 0x22, 0x33, 0x78, 0x04]
    pay = []
    
    for x in b:
      fmtb.process(x)
    
      if fmtb.is_comp():
        pay = fmtb.get_payload()
        break