基于Python设计的CRC-16 校验码计算器

零壹の空间 2024-07-31 16:35:01 阅读 53

基于Python设计的CRC-16 校验码计算器,CRC16离线计算器。

缘由:某日在做测试时,发现某位网友的CRC计算器无法正常使用了,哇,怎么回事?经过排查,感情他那工具是需要调用网络接口的,实际是个网页在线CRC计算器。不巧的是本人电脑刚搬迁过来,网络未通,网线还没有,遂,自己动手搓一个。于是诞生了这个。

本人不保证该作品没有bug,也没有经过严谨的测试验证,在任何情况下,无论因何种原因,本人均不承担因使用本程序或者代码所造成的任何直接、间接、特别、附带或间接损失的赔偿责任。

一、使用说明

双击 “<code>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

二、源码使用[only for programmer]

1、安装<code>python

Python 安装

2、测试、运行

git clone https://gitee.com/zerone_space/crc16_calculator

cd crc16_calculator

python CRC16_Calculator.py

4、打包

4.1、安装虚拟环境

pip install pipenv

Tips:首次使用需要 pipenv 安装

4.2、进入虚拟环境

pipenv shell

4.3、在虚拟环境中安装 pyinstaller 打包工具

pip install pyinstaller -i https://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com

Tips:每次重新打包都需要安装

4.4、在虚拟环境中使用pyinstaller打包成可执行文件(.exe)

pyinstaller -F -w -i logo.ico ./src/CRC16_Calculator.py

4.5、完成打包,退出虚拟环境,再删除虚拟环境

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=''code>

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"))code>

self.label00.grid(row=0,column=1)

self.label01 = Label(self,text='数 据(Hex)',font=(font_str, 10))code>

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))code>

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))code>

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))code>

self.CheckB1.grid(row=4,column=0) # pack()

self.CheckB2 = Checkbutton(self, text="输出反转", variable=self.refout,font=(font_str, 10))code>

self.CheckB2.grid(row=4,column=1) # pack()

self.CheckB3 = Checkbutton(self, text="高位在左", variable=self.highfirst,font=(font_str, 10))code>

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))code>

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))code>

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)code>

# 计算过程,在‘计算’按钮按下时调用

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()



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。