python計算CRC16等
智能電能表數據通信協議DL/T 645 - 2007;本部分實現了該協議的部分功能。
'''
計算645數據域數據長度
@Source 2013-5-10 16:30
'''
def LenCal(s):
L=''
L=hex(len(s)/2).replace('0x','')
if len(L)<=1:
L=('00'+L)[-2:]
return L
'''
對16進制字符串進行加0x33處理
@Source 2013-5-10 12:00
'''
def Add33(s):
h=''
for i in range(len(s)/2):
temper=''
temper=hex(int('33',16)+int(s[2*i:2*i+2],16)).replace('0x','')
if len(temper)<=1:
temper=('00'+temper).upper()[-2:]
h=h+temper
##返回加0x33後的數據
return h
'''
對16進制字符串進行減0x33處理
@Source 2013-5-10 12:10
'''
def Reduce33(s):
h=''
for i in range(len(s)/2):
temper=''
temper=hex(int(s[2*i:2*i+2],16)-int('33',16)).replace('0x','')
##如果餘值爲負數,去除'-'
temper=temper.replace('-','')
if len(temper)<=1:
temper=('00'+temper).upper()[-2:]
h=h+temper
##返回減0x33後的數據
return h
'''
計算16進制字符串的CRC16校驗
@Source 2013-5-10 11:00
'''
def CRC16(s):
h='0'
for i in range(len(s)/2):
h=hex(int(h,16)+int(s[2*i:2*i+2],16))
h=h.replace('0x','')
if len(h)<=1:
h='00'+h
return h.upper()[-2:]
##68AAAAAAAAAAAA681300DF16
##print CRC16('68AAAAAAAAAAAA681300')
##print Add33('010101010101')
##print Reduce33('010101010101')
print LenCal('010101010101')