介面如下圖:
介面很簡單 從網上隨便找了個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後同步到個別的 節點同步失敗,所以考...