読者です 読者をやめる 読者になる 読者になる

ECHONETLiteパーサ

コード

# coding:utf8
# python3.4.4

def el_parser(code):
    try:
        dict_ = {}

        dict_['ehd1'] = code[0:2]
        dict_['ehd2'] = code[2:4]
        dict_['tid'] = code[4:8]
        dict_['seoj'] = code[8:14]
        dict_['deoj'] = code[14:20]
        dict_['esv'] = code[20:22]
        dict_['opc'] = code[22:24]

        edata = code[24:]

        #opcで記されている分だけkeyを作ってやって振り分ける
        for i in range(int(dict_['opc'], 16)):
            for key in ['epc', 'pdc', 'edt']:
                if key is 'edt':
                    pdc_ = int(dict_['pdc'+str(i)], 16)*2

                    if pdc_ is 0:
                        break

                    d = edata[:pdc_]
                    dict_[key+str(i)] = d
                    edata = edata[pdc_:]

                else:
                    d = edata[:2]
                    dict_[key+str(i)] = d
                    edata = edata[2:]

        if len(edata) is not 0:
            raise

    #ELに準拠したコードでなければFalseを返す
    except:
        return False

    else:
        return dict_

使い方

# coding:utf8
# python3.4.4

from el import el_parser
from pprint import pprint #出力を見やすくするために

code1 = "1081000005ff010ef0016201d600" #ELコード
code2 = "elko-dozyanaiyatu123456789@@" #ELコードじゃないやつ

pprint(el_parser(code1))
print('----------------------------')
pprint(el_parser(code2))

出力結果

{'deoj': '0ef001',
 'ehd1': '10',
 'ehd2': '81',
 'epc0': 'd6',
 'esv': '62',
 'opc': '01',
 'pdc0': '00',
 'seoj': '05ff01',
 'tid': '0000'}
----------------------------
False