概述
废话不多直接上代码
widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
extern "C" {
#include "crc.h"
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
Widget::initWindows();
}
Widget::~Widget()
{
delete ui;
}
void Widget::initWindows()
{
setWindowTitle("crc software");
}
void Widget::on_clear_creat_data_button_clicked()
{
ui->creat_data_textEdit->clear();
}
void Widget::on_clear_get_data_button_clicked()
{
ui->get_data_textEdit->clear();
}
void Widget::on_get_data_button_clicked()
{
//QString get_data = ui->get_data_text->text();
//char buff[4096] ={0};
//QByteArray ba = ui->get_data_text->text();
//memcpy(buff, ba.toStdString().c_str(), ba.toStdString().length());
/* char buff[4096] ={0};
char* ptr;
QString getdata = ui->get_data_textEdit->toPlainText();
QByteArray ba;
ba = getdata.toLatin1();
ptr = ba.data();
memcpy(buff, ptr, ba.length());
ui->creat_data_textEdit->append(QString("获取数据长度: %1").arg(ba.length()));
ui->creat_data_textEdit->append(buff);
*/
/* QString inputData = ui->get_data_textEdit->toPlainText();
if(inputData.isEmpty()) return;
auto data = QByteArray::fromHex(inputData.toLocal8Bit());*/
/*uint8_t buff[] ={0x55, 0x66, 0x00, 0x02, 0x00, 0x01, 0x00, 0x3A, 0x11, 0x22};
uint16_t checksum = CRC16_cal(buff, sizeof(buff), 0);
ui->creat_data_textEdit->append(QString("校验值: %1").arg(uint8_t((checksum&0xff)), 0, 16) + QString(" %1").arg(uint8_t((checksum&0xff00) >> 8), 0, 16));
*/
QString getData = ui->get_data_textEdit->toPlainText();
if(getData.isEmpty())
return;
/* if(getData.endsWith(" "))
{
QString handledata = getData.section(" ", 1, 1);
ui->creat_data_textEdit->append(handledata);
}*/
QStringList getdatalist=getData.split(" ");//将数据以空格拆分,并放入数组中
//qDebug()<<getdatalist.length();
ui->creat_data_textEdit->append(QString("获取数据长度: %1").arg(getdatalist.length()));
uint8_t buff[4096] ={0};
uint16_t buff16[4096] ={0};
int bufflen = 0;
for(int i = 0; i < getdatalist.length(); i++)
{
if(getdatalist.at(i) == " ")
{
ui->creat_data_textEdit->append("数据空格过多");
return;
}
QString getdata = getdatalist.at(i);
if(getdata.length() > 2)
{
qDebug()<<getdata.length();
ui->creat_data_textEdit->append("数据错误");
return;
}
buff[bufflen] = getdata.toInt(0, 16);
buff16[bufflen] = getdata.toInt(0, 16);
if(buff16[bufflen++] > 0xff)
{
ui->creat_data_textEdit->append(QString("数据错误,数据是: 0x%1").arg(buff16[bufflen - 1], 0, 16));
return;
}
/*if(getdata > 0xff)
{
ui->creat_data_textEdit->append("数据错误");
return;
}
else*/
{
qDebug()<<buff[bufflen - 1];
}
}
uint16_t checksum = CRC16_cal(buff, bufflen, 0);
// ui->creat_data_textEdit->append(QString("校验值: %1").arg(uint8_t((checksum&0xff)), 0, 16) + QString(" %1").arg(uint8_t((checksum&0xff00) >> 8), 0, 16));
QString outstrdata = "数据:";
for(int i = 0; i < bufflen; i++)
{
outstrdata += QString().sprintf("%02x ", buff[i]);
}
outstrdata += QString("%1 ").arg(uint8_t((checksum&0xff)), 2, 16);
outstrdata += QString("%1 ").arg(uint8_t((checksum&0xff00) >> 8), 2, 16);
ui->creat_data_textEdit->append(outstrdata);
}
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void initWindows();
void on_clear_creat_data_button_clicked();
void on_clear_get_data_button_clicked();
void on_get_data_button_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
crc.c文件
#include "crc.h"
/*
crc 计算都遵循MSB First 的规则
CRC8:31
CRC-16:1021
*/
const uint8_t crc8_tab[256];
const uint16_t crc16_tab[256];
const uint32_t crc32_tab[256];
/***********************************************************
CRC8 Coding & Decoding G(X) = x^8+x^5+x^4+x^0 (31)
***********************************************************/
uint8_t CRC8_cal(uint8_t *ptr, uint32_t len, uint16_t crc_init)
{
uint8_t crc;
crc = crc_init;
while (len--!=0)
{
crc=crc8_tab[*ptr^crc];
ptr++;
}
return(crc);
}
/***********************************************************
CRC16 Coding & Decoding G(X) = X^16+X^12+X^5+1
***********************************************************/
uint16_t CRC16_cal(uint8_t *ptr, uint32_t len, uint16_t crc_init)
{
uint16_t crc, oldcrc16;
uint8_t temp;
crc = crc_init;
while (len--!=0)
{
temp=(crc>>8)&0xff;
oldcrc16=crc16_tab[*ptr^temp];
crc=(crc<<8)^oldcrc16;
ptr++;
}
//crc=~crc; //??
return(crc);
}
/***********************************************************
CRC32 Coding & Decoding G(X) = X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X+1
***********************************************************/
uint32_t CRC32_cal(uint8_t *ptr, uint32_t len, uint16_t crc_init)
{
uint32_t crc,
oldcrc32;
uint8_t temp;
crc = crc_init;
while (len--!=0)
{
temp=(crc>>24)&0xff;
oldcrc32=crc32_tab[*ptr^temp];
crc=(crc<<8)^oldcrc32;
ptr++;
}
return(crc);
}
/*
* Notes 这个不需要crc16tab
*/
uint16_t cal_crc16_none_table(unsigned char *ptr, int32_t count, uint16_t crc_init)
{
int crc;
char i;
crc = crc_init;
while (--count >= 0)
{
crc = crc ^ (int) *ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
}
while(--i);
}
return (crc&0xFFFF);
}
const uint8_t crc8_tab[256]=
{
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
};
const uint16_t crc16_tab[256]= {0x0,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0x1231,0x210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0x2462,0x3443,0x420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0x3653,0x2672,0x1611,0x630,0x76d7,0x66f6,0x5695,0x46b4,
0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0x48c4,0x58e5,0x6886,0x78a7,0x840,0x1861,0x2802,0x3823,
0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0xa50,0x3a33,0x2a12,
0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0xc60,0x1c41,
0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0xe70,
0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
0x1080,0xa1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0x2b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0x34e2,0x24c3,0x14a0,0x481,0x7466,0x6447,0x5424,0x4405,
0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0x26d3,0x36f2,0x691,0x16b0,0x6657,0x7676,0x4615,0x5634,
0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0x5844,0x4865,0x7806,0x6827,0x18c0,0x8e1,0x3882,0x28a3,
0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0x4a75,0x5a54,0x6a37,0x7a16,0xaf1,0x1ad0,0x2ab3,0x3a92,
0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0xcc1,
0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0xed1,0x1ef0
};
const uint32_t crc32_tab[256]= {0x0,0x4c11db7,0x9823b6e,0xd4326d9,
0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005,
0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61,
0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd,
0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9,
0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75,
0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011,
0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd,
0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039,
0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5,
0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81,
0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d,
0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49,
0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95,
0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1,
0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d,
0x34867077,0x30476dc0,0x3d044b19,0x39c556ae,
0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072,
0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16,
0x18aeb13,0x54bf6a4,0x808d07d,0xcc9cdca,
0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde,
0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02,
0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066,
0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba,
0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e,
0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692,
0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6,
0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a,
0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e,
0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2,
0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686,
0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a,
0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637,
0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb,
0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f,
0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53,
0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47,
0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b,
0x315d626,0x7d4cb91,0xa97ed48,0xe56f0ff,
0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623,
0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7,
0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b,
0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f,
0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3,
0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7,
0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b,
0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f,
0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3,
0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640,
0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c,
0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8,
0x68860bfd,0x6c47164a,0x61043093,0x65c52d24,
0x119b4be9,0x155a565e,0x18197087,0x1cd86d30,
0x29f3d35,0x65e2082,0xb1d065b,0xfdc1bec,
0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088,
0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654,
0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0,
0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c,
0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18,
0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4,
0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0,
0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c,
0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668,
0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4
};
crc.h文件
#ifndef __CRC_H__
#define __CRC_H__
#include <stdint.h>
uint8_t CRC8_cal (uint8_t *ptr, uint32_t len, uint16_t crc_init);
uint16_t CRC16_cal (uint8_t *ptr, uint32_t len, uint16_t crc_init);
uint32_t CRC32_cal (uint8_t *ptr, uint32_t len, uint16_t crc_init);
uint16_t cal_crc16_none_table(unsigned char *ptr, int32_t count, uint16_t crc_init);
#endif //__CRC_H__
界面截图
源码链接:https://download.csdn.net/download/dailin2012/87686166?spm=1001.2014.3001.5503
最后
以上就是会撒娇纸鹤为你收集整理的使用QT制作CRC校验工具的全部内容,希望文章能够帮你解决使用QT制作CRC校验工具所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复