Qt5 9 寫的乙個crc校驗例子

2021-08-19 13:36:27 字數 4159 閱讀 5261

介面如下圖:

介面很簡單 從網上隨便找了個crc8  crc16 crc32演算法直接加進去了,想實現其他演算法的自己新增就可以了

main就不介紹了,介面 乙個textedit  commbox pushbutton lineedit 就這幾個控制項

通過訊號槽判斷選中的演算法然後 pushbutton按下去執行對應的演算法

**如下:

crcchecksum.h
#ifndef crcchecksum_h

#define crcchecksum_h

#include #include #include #include #include #include #include typedef unsigned char u8;

typedef unsigned char byte;

typedef unsigned short u16;

typedef unsigned int u32;

class crcchecksum

;#endif // crcchecksum_h

crcchecksum.cpp

#include "crcchecksum.h"

crcchecksum::crcchecksum()

// x16 x15 x2 1

quint16 crcchecksum::crc16formodbus(const qbytearray &data)

; quint8 buf;

quint16 crc16 = 0xffff;

for ( auto i = 0; i < data.size(); ++i )

return crc16;}/*

多項式一:x8+x5+x4+1 0x31

多項式二:x8+x2+x1+1 0x07

多項式三:x8+x6+x4+x3+x2+x1 0x5e

*///crc-8/maxim: x8+x5+x4+1

static const u8 cacrc8data[256] = ;

quint8 crcchecksum::crc8(const qbytearray &data)

// return (crc8);

quint8 buf;

quint8 crc8 = 0x00; /* 該處修改 */

for(auto i = 0;i>= 1;

// crc16 ^= 0xa001;

// } else

// }

// }

// crc16 = (crc16 >> 8) + (crc16 << 8);

// return (crc16);

quint16 c,crc16;

crc16 = 0xffff;

for(int i=0; i< data.size();i++)else}}

crc16 = (crc16 >>8 ) + (crc16<<8);

return (crc16);

}u32 crcchecksum::crc32(byte *_pbuff, u16 _size) else

if (_pbuff[i] & (1 << j)) }}

crc32 = ~crc32;

return (crc32);

}

widget.cpp

#include "widget.h"

#include "ui_widget.h"

#include "crcchecksum.h"

widget::widget(qwidget *parent) :

qwidget(parent),

ui(new ui::widget)

widget::~widget()

/* static u8 crc8sumtable(u8 *p, int len);

u8 crc8sum(u8 *buf, int len);

void coverhex(u8 *des,u8 *source, int len);

*/void widget::on_pushbutton_clicked()

case 1://crc16

case 2://crc32

case 3:

break;

default:

break;

}ui->lineedit->settext(str);

}void widget::currentindexchanged(int currentindex)

crc校驗(迴圈冗餘校驗)小知識

crc即迴圈冗餘校驗碼(cyclic redundancy check):是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。迴圈冗餘檢查(crc)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。

crc演算法引數模型解釋:

name:引數模型名稱。

width:寬度,即crc位元數。

poly:生成項的簡寫,以16進製表示。例如:crc-32即是0x04c11db7,忽略了最高位的"1",即完整的生成項是0x104c11db7。

init:這是演算法開始時暫存器(crc)的初始化預置值,十六進製制表示。

refin:待測資料的每個位元組是否按位反轉,true或false。

refout:在計算後之後,異或輸出之前,整個資料是否按位反轉,true或false。

xorout:計算結果與此引數異或後得到最終的crc值。

關於校驗不一樣的說明:

由於採用不同的校驗方式,crc8也有多種校驗演算法,各有差異.

方法一:

void crc8_cdt_init(uint32_t poly) 

table[i] = crc;

if ((i + 1) % 8 == 0) else

}}uint8_t crc8_cdt(uint8_t crc, void* input, int len)

return crc ^ 0xff;

}/* 呼叫方式 */

char hexd[5] = ;

crc8_cdt_init(0x07); /* 0x5e 生成表 */

crc = crc8_cdt(0x00, hexd, 5);

printf("crc8_cdt_5e = 0x%02x\n", (uint8_t)crc);

方法二:

unsigned char crc_8_bit(unsigned char* pdata, int count) 

} return crc;

}// 按位元組計算crc8

unsigned char crc_8_byte(unsigned char* pdata, int count) ;

unsigned char crcb = 0;

for (int i = 0; i < 0x100; ++i) else

} // 查表計算

unsigned char crc = 0x00;

for (int n = 0; n < count; ++n)

return crc;

}unsigned char crc_8_m(unsigned char* pdata, int count)

/* 呼叫方式 */

crc = crc_8_m(hexd, 5);

printf("crc8_m_5e = 0x%02x\n", (uint8_t)crc);

寫乙個死鎖的例子

這是乙個很好玩的題,做併發的話,不小心能寫出來。讓你寫乙個一定死鎖的例子,沒有思考過的話,確實不容易。下邊的是 的乙個,別人寫的。非常典型的乙個互相等待導致的死鎖的例子,很好理解。package com.spri.test 在實際程式設計中,要盡量避免出現死鎖的情況,但是讓你故意寫乙個死鎖的程式時似...

Nodejs 實現乙個CRC16校驗

近日在開發乙個資料平台,據說nodejs比較適合dirt型別的程式,所以也搞了一把,雖然接收 及其報文解析等功能順利的實現了,但是由於某些報文涉及到應答,故而需要crc校驗,也算是乙個小坑吧,故而記錄一下。完整報文 0101qn 20160801085857223 st 32 cn 1062 pw ...

結合ruby寫的乙個校驗工具

背景 每次發布detail這邊一般都要發布多個js檔案,然後同步到不同的cdn 現階段cdn有提供乙個平台,前端在發布js後可以根據js的檔名來逐個校驗下每個js是否同步到每乙個cdn節點,但在有多個js發布的時候,可能不能逐一校驗,detail這邊有出現發布js後同步到個別的 節點同步失敗,所以考...