python计算excel crc_Python实现CRC计算器

python计算excel crc_Python实现CRC计算器目录一 C 语言实现模 2 CRC 算法二 Python 代码实现模 2 CRC 算法三 使用 PyQT 制作上位机 3 1 制作 UI3 2 转化 UI 为 Python 代码 3 3 添加主函数并打包 exe 一 C 语言实现模 2 CRC 算法模 2 CRC 算法模块函数的 C 语言代码如下 模 2 CRC 算法的实现原理可以参考另外一篇博客 模 2CRC 算法 unsignedshor unsignedchar data

目录

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

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

三、使用PyQT制作上位机

3.1、制作UI

3.2、转化UI为Python代码

3.3、添加主函数并打包exe

一、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,, 03003f0000000′ # 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是十六进制大写输出

dcbc367a3b0bf80816881bcb4acb2200.png

三、使用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。

89407a19b8428016a200ffe9542633a8.png

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。整个工程源码下载链接:源码下载。

a66f1cfd19a8cb738fd6e95661a558b2.png

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224910.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午10:52
下一篇 2026年3月17日 上午10:52


相关推荐

  • ReactNative入门(安卓)——API(上)

    ReactNative入门(安卓)——API(上)Alert-弹窗通过Alert.alert()方法调用唤起原生弹窗,点击会触发onPress回调(参考下方代码)并清除弹窗。importReact,{AppRegistry,C

    2022年7月3日
    53
  • php soapclient xml,PHP SoapClient请求

    php soapclient xml,PHP SoapClient请求我正在尝试使用 thisWSDL 将 SOAP 请求发送到新闻通讯服务 这是我的 PHP client newSoapClien wsdl url array login gt myusername password gt mypassword trace gt true client gt AddSubscribe newSoapParam

    2026年3月19日
    2
  • 跨域是什么?[通俗易懂]

    跨域是什么?[通俗易懂]跨域指的是不同服务器之间不能相互访问各自的资源或者数据,这出于一个策略——“同源策略”,那么为什么要这么设计呢,这是因为,一些网站的数据可能涉及的用户的隐私,因此不属于当前服务器的网站时不能访问它的,就比如,我们登陆淘宝后,由不小心点进了其他的一个钓鱼网站,如果说不这么设置,那么钓鱼网站就可以获取到你的登陆账号和密码,进而可以达到使用你的账户购买东西的目的,因此跨域是出于安全的考虑而诞生的。实…

    2022年6月12日
    28
  • 用Markdown画流程图

    用Markdown画流程图流程图语法 流程图的语法大体分为两部分 流程图元素定义部分 连接流程图元素部分 该部分用来指明流程图的执行走向 定义元素的语法 tag gt type content gt url 实例 flowchatst gt start 开始 e gt end 结束 op gt operation 操作 sub1 gt subroutine 子程序 cond gt condition YesorNo io gt inputoutput 输入 输出 st gt op

    2026年3月17日
    2
  • 如何激活成功教程Mac软件的付费限制(一)

    如何激活成功教程Mac软件的付费限制(一)一、前言在使用Mac的过程中,经常会碰到一些软件,属于付费使用产品。那么处于好奇或者自学的目的,能不能绕过这个限制呢。今天简单的分享下我激活成功教程的几款软件当中的一款,具体是什么软件就不说了,主要是提供下激活成功教程的思路。由于不能供发图,所以这里简单介绍下这款软件。这款软件是AppStore上的一款磁盘清理软件,扫描是免费的。扫描到数据之后,点击清理按钮时候会检查是否注册。如果注册了,直接进入清理程序,否…

    2022年6月15日
    122
  • 宝塔开启nginx防火墙导致nginx无法启动

    宝塔开启nginx防火墙导致nginx无法启动问题现象 宝塔搭建的 nginx 无法启动 nginx t 报错 nginx theconfigura etc nginx nginx confsyntaxis configuratio etc nginx nginx conftestfail 日志中没有任何报错 nginx 命令启动后也没有报错 端口无法监听 是由于刚开启了 nginx 防火墙 但是由于用户 nginx 版本较低 无法开启将 www server panel vhost ng

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号