赞
踩
缘由:某日在做测试时,发现某位网友的CRC计算器无法正常使用了,哇,怎么回事?经过排查,感情他那工具是需要调用网络接口的,实际是个网页在线CRC计算器。不巧的是本人电脑刚搬迁过来,网络未通,网线还没有,遂,自己动手搓一个。于是诞生了这个。
本人不保证该作品没有bug,也没有经过严谨的测试验证,在任何情况下,无论因何种原因,本人均不承担因使用本程序或者代码所造成的任何直接、间接、特别、附带或间接损失的赔偿责任。
CRC16_Calculator.exe
” ,运行程序,会弹出程序窗口。仓库地址:Gitee
下载地址:发布
URL :https://gitee.com/zerone_space/crc16_calculator
下载: https://gitee.com/zerone_space/crc16_calculator/releases/tag/v1.0.1-beta
python
git clone https://gitee.com/zerone_space/crc16_calculator
cd crc16_calculator
python CRC16_Calculator.py
pip install pipenv
Tips:首次使用需要
pipenv
安装
pipenv shell
pyinstaller
打包工具pip install pyinstaller -i https://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com
Tips:每次重新打包都需要安装
pyinstaller
打包成可执行文件(.exe)pyinstaller -F -w -i logo.ico ./src/CRC16_Calculator.py
exit
pipenv --rm
Tips:不删除虚拟环境也是可以的,这样下次重新打包,
则不需要重新安装pyinstaller
from tkinter import * from tkinter import messagebox #font_str = "Times New Roman" font_str = "阿里巴巴普惠体" #font_str = "Source Han Sans CN" # 按位(bit)反转, def reverse(din,len_din): din_bin=bin(din) din_bin_str=str(din_bin) dout_bin_str='' for i in range(len_din): if (i < len(din_bin_str)-2): dout_bin_str = dout_bin_str + (din_bin_str[len(din_bin_str)-i-1]) else: dout_bin_str = dout_bin_str + '0' dout = int(dout_bin_str,2) return dout # 按Byte 反转,高位和低位交换位置 def exchange(din): binstr = '{:016b}'.format(int(din,16)) inv_str = binstr[8:] + binstr[:8] dout = int(inv_str,2) return dout class Application(Frame): def __init__(self,master=None): super().__init__(master) self.master = master self.pack() self.CreatWidget() # tkinter 组件创建UI界面 def CreatWidget(self): self.label00 = Label(self,text='CRC-16 校验码离线计算器',font=(font_str, 12, "bold")) self.label00.grid(row=0,column=1) self.label01 = Label(self,text='数 据(Hex)',font=(font_str, 10)) self.label01.grid(row=1,column=0) self.hexstr = StringVar() self.entry01 = Entry(self,textvariable=self.hexstr,width=50,font=(font_str, 10)) self.entry01.grid(row=1,column=1) self.hexstr.set('01 02 03') # 设置默认值 self.label04 = Label(self, text='多项式(Hex)',font=(font_str, 10)) self.label04.grid(row=2,column=0) poly = StringVar() self.entry04 = Entry(self,textvariable=poly,width=50,font=(font_str, 10)) self.entry04.grid(row=2,column=1) poly.set('0x8005') # 设置默认值 self.label05 = Label(self, text='初始值(Hex)',font=(font_str, 10)) self.label05.grid(row=3,column=0) init = StringVar() self.entry05 = Entry(self,textvariable=init,width=50,font=(font_str, 10)) self.entry05.grid(row=3,column=1) init.set('0xFFFF') # 设置默认值 # 创建布尔变量 self.refin = IntVar(value=1) self.refout = IntVar(value=1) self.highfirst = IntVar(value=1) # 创建复选按钮组件 self.CheckB1 = Checkbutton(self, text="输入反转", variable=self.refin,font=(font_str, 10)) self.CheckB1.grid(row=4,column=0) # pack() self.CheckB2 = Checkbutton(self, text="输出反转", variable=self.refout,font=(font_str, 10)) self.CheckB2.grid(row=4,column=1) # pack() self.CheckB3 = Checkbutton(self, text="高位在左", variable=self.highfirst,font=(font_str, 10)) self.CheckB3.grid(row=4,column=2) # pack() # 计算结果显示 self.result = StringVar() self.result.set('0x0000') self.label06 = Label(self, text='结 果(Hex)',font=(font_str, 10)) self.label06.grid(row=6,column=0) self.result_label = Entry(self, textvariable=self.result,width=50,font=(font_str, 10)) self.result_label.grid(row=6, column=1) self.resbin = StringVar() self.resbin.set('0000000000000000') self.label07 = Label(self, text='结 果 (Bin)',font=(font_str, 10)) self.label07.grid(row=7,column=0) self.resbin_label = Entry(self, textvariable=self.resbin,width=50,font=(font_str, 10)) self.resbin_label.grid(row=7, column=1) Button(self,text='计算',command=self.calculate,font=(font_str, 10)).grid(row=5,column=1) # 计算过程,在‘计算’按钮按下时调用 def calculate(self): self.textfmt() hex_input = self.entry01.get() refin = self.refin.get() #输入数据反转 refout = self.refout.get() #输出数据反转 crc16= int(self.entry05.get(),16)#0xffff #初始值 poly = int(self.entry04.get(),16)#0x8005 #多项式 highfirst = self.highfirst.get()#高位在左,地位在右 print('REFIN :'+str(refin)) print('REFOUT:'+str(refout)) print('INPUT :'+str(hex_input)) print('INIT :'+str(crc16)) print('POLY :'+str(poly)) poly = reverse(poly,16) ls = hex_input.split() datas=list(ls) for data_str in datas: data=int(data_str,16) if (refin == 0): data = reverse(data,8) crc16 = data ^ crc16 for i in range(8): if 1&(crc16) == 1: crc16 = crc16 >> 1 crc16 = crc16^poly else: crc16 = crc16 >> 1 if (refout == 0): result = hex(reverse(crc16,16)) else: result = hex(crc16) if highfirst == 0: result = hex(exchange(result)) binstr = '{:016b}'.format(int(result,16)) self.resbin.set(str(binstr)) result = result[2:] self.result.set('0x'+str(result).upper()) print('Hex_Res:' + '0x'+result.upper()) print('Bin_Res:' + binstr) def textfmt(self): plaintext = self.entry01.get() print(plaintext) import re plaintext = re.sub(r'[^0-9a-fA-F]','',plaintext) result = ' '.join(plaintext[i:i+2] for i in range(0, len(plaintext), 2)) self.hexstr.set(result) if __name__ == '__main__': root = Tk() sw = root.winfo_screenwidth() sh = root.winfo_screenheight() w = 600 h = 220 x = (sw-w)/2 y = (sh-h)/2 root.geometry("%dx%d+%d+%d" %(w,h,x,y)) root.title('CRC-16 离线计算工具') root.resizable(0,0) #root.iconbitmap('../logo.ico') Application(master=root) root.mainloop()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。