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

文章介绍了作者因为网络问题,开发了一个基于Python的离线CRC-16校验码计算器,用于计算CRC-16校验码,无需依赖网络。它还包含了源码和使用指南,以及如何使用Python的Tkinter和pyinstaller进行打包和部署。
摘要由CSDN通过智能技术生成

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

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

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

一、使用说明

  1. 双击 “CRC16_Calculator.exe” ,运行程序,会弹出程序窗口。
  2. 按照你的需求填写数据,点击计算即可显示结果。
  3. 程序界面如下:
    出现界面

仓库地址: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、安装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=''
    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()
  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值