#-*-コーディング:utf-8-*-
#!/ usr / bin / env python3
import crcmod.predefined
クラスcrc16:
def __init __(self):
pass
def crc16Modbus(self、bytes_data、start_pos、stop_pos、invert = False):
a = 0xFFFF
b = 0xA001
for i in range(start_pos、stop_pos):
a ^ = bytes_data [i]
for j in range(8):
last = a %2
a >> = 1
if last == 1:
a ^ = b
return(a << 8&0xff00)| a >> 8 if invert == False else a
def crc16Modbus2(self、bytes_data、start_pos、stop_pos、invert = False):
data = bytes_data [start_pos:stop_pos]
modus_crc_func = crcmod.predefined.mkCrcFun( 'modbus')
res = modus_crc_func (データ)
リターン(res << 8&0xff00)| res >> 8 if invert == False else res
def crc16Xmodem(self、bytes_data、start_pos、stop_pos、invert = False):
wcrc = 0
for i in range(start_pos、stop_pos):
data = bytes_data [i]
for j in range (8):
treat = data&0x80
data << = 1
bcrc =(wcrc >> 8)&0x80
wcrc << = 1
wcrc = wcrc&0xffff
if(treat!= bcrc):
wcrc ^ = 0x1021
return wcrc if invert == False else(wcrc << 8&0xff00)| wcrc >> 8
def crc16Xmodem2(self、bytes_data、start_pos、stop_pos、invert = False):
data = bytes_data [start_pos:stop_pos]
xmodem_crc_func = crcmod.predefined.mkCrcFun( 'xmodem')
res = xmodem_crc_func(data)
return res if invert = = (res << 8&0xff00)| res >> 8
#デバッグタイプ:singel file
#ファイル名:mycrc16.py
#ファイルバージョン:v0.0
#デバッグ時間:2020.8.26
if __name__ == '
__ main __ ':crc16_test = crc16()
print(hex(crc16_test.crc16Modbus(bytes( '123456789'、encoding = 'utf8')、
0、9 )))print(hex(crc16_test.crc16Modbus2(bytes( '123456789'、encoding = 'utf8')、
0、9 )))print(hex(crc16_test。 crc16Xmodem(bytes( '123456789'、encoding = 'utf8')、
0、9 )))print(hex(crc16_test.crc16Xmodem2(bytes( '123456789'、encoding = 'utf8')、0、9)))
'' '
注:
パラメーターの説明
入力パラメーター:検証対象のbytes_dataバイト文字列データ、
start_pos
検証データの開始位置stop_pos検証データの終了位置
invert = False検証結果は、デフォルトで最初に下位バイトになります。invert = Trueの場合は、上位になります。バイトは最初の
パラメータです:
2バイトのチェック結果
を出力するcrc16Modbusはそれ自体で実装され、crc16Modbus2はライブラリを呼び出すことによって実装されます;
crc16Xmodem2はそれ自体で実装され、crc16Xmodem2はライブラリを呼び出すことによって実装されます;
'' '