python计算excel crc_CRC计算器的Python实现

目录

一、C语言实现模2-CRC算法

模2-CRC算法模块函数的C语言代码如下,模2-CRC算法的实现原理可以参考另外一篇博客:

模2CRC算法

unsigned short int crc(unsigned char *data_add, unsigned char len_data)

{

unsigned char i=0,len_word=0;

unsigned short int word[100] = { 0x0000 };

unsigned short int crc_value=0x0000;

len_word = len_data / 2;

for (i = 0; i < len_word; i++)

{

word[i]=(data_add[2*i]<<8)+(data_add[2*i+1]);//两个字节合成一个字

word[i]=word[i]>> (i%16) | word[i]<< (16 - (i%16));//对数据字进行循环移位

crc_value = crc_value ^ word[i];//求循环移位后的校验和字

}

crc_value = (crc_value << (len_word%16)) | (crc_value >> (16-(len_word%16)));//对上个结果进行反向循环移位

return crc_value;

}

二、Python代码实现模2-CRC算法

# 输入字节长度最大100,输出为16位大小的crc_value

def crc16(data_add, len_data):

word = [0] * 100 # python里面没有16位数据类型,定义为int型,数组大小为100

crc_value = 0 # crc的初始值为int类型0

len_word = len_data >> 1 # 字符串是半个字节,所以除以2

for i in range(0, int(len_word)):

str4 = data_add[(i * 4): (4 + i * 4)] # 每次取4个字符串,上位机读进来的是字符串

word[i] = int(str4,16) # 字符串转成10进制 如'0200'→ 512

word[i] = (word[i] >> (i % 16) | (word [i] << (16 - (i % 16))) & 0xFFFF) # 循环移位,因为是int类型,左移之后要& 0xFFFF保证只取低16位

crc_value = crc_value ^ word[i] # 求循环移位后的校验和字

crc_value = (((crc_value << (len_word % 16)) & 0xFFFF) | (crc_value >> (16-(len_word % 16)))) # 对上个结果进行反向循环移位

return crc_value

C语言代码转换成Python代码如上,测试代码如下,输出结果正确,并且字符串之间的英文空格和逗号被去掉,所以对于上位机的输入操作比较友好,可以不用手动去除空格逗号等。

from crc import *

test = '02 00,, 03003f800000000000000000' # 02 00 03 00 3f 80 00 00 00 00 00 00 00 00 30 06

test = test.replace(" ", "") # 去掉空格

test = test.replace(",", "") # 去掉逗号

test_out = crc16(test, int(len(test)/2)) # int(len(test)/2是输入的字节数

print("%X" % test_out) # %X是十六进制大写输出

三、使用PyQT制作上位机

3.1、制作UI

代码封装为crc.py,开始制作UI界面,打开QTDesigner,新建一个UI,命名为

crc_ui.ui

设计好UI界面。首先添加

QWidget

(默认名字为

Form

),

,

然后添加

QLineEdit(

命名为Input并去掉属性Read Only,另外一个命名为Output,保留Read only)、

QLabel

(添加作者信息、版本号等)、

QPushButton

(命名为CalcButton)等Object。

3.2、转化UI为Python代码

打开PyCharm→External Tools里面的PyUIC,将

crc_ui.ui

转化为

crc_ui.py

。其中External Tools如何添加QTDesigner和PyUIC可以参考博客设置

添加External Tools

3.3、添加主函数并打包exe

新建 main.py,添加如下代码,使用PyInstaller打包成一个单独的exe,命令:

PyInstaller -F main.py -w

。其中

-F

是打包成一个单独的exe,

-w

是去掉软件启动前的命令行串口,打包后的exe放到了工程目录的dist文件夹下,打开exe测试如图1。整个工程源码下载链接:

源码下载

import sys

from crc import *

from crc_ui import Ui_Form # QWidget命名为Form所以导入的是Ui_Form,同下

from PyQt5.QtWidgets import QApplication, QMainWindow

class myForm(QMainWindow , Ui_Form):

def __init__(self):

super(myForm,self).__init__()

self.setupUi(self)

self.setWindowTitle("CRC计算器") # 命名上位机名称

self.CalcButton.clicked.connect(self.calc_crc)

def calc_crc(self):

Arr_Input = self.Input.text() # 读取输入

Arr_Input = Arr_Input.replace(" ", "") # 去掉空格

Arr_Input = Arr_Input.replace(",", "") # 去掉逗号

Arr_Input = Arr_Input.replace("'", "") # 去掉'

Arr_out_int = crc16(Arr_Input, int(len(Arr_Input) / 2)) # int(len(Arr_Input)/2是输入的有效字节数

Arr_out_hex = '{:02X}'.format(Arr_out_int) # 十进制转换成字符串

self.Output.setText(Arr_out_hex) # QLineEdit使用setText显示字符串 Text Browser使用insertPlainText显示

if __name__=="__main__":

app=QApplication(sys.argv)

win=myForm()

win.show()

sys.exit(app.exec_())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值