C++实现循环冗余校验(CRC)算法
时间: 2023-08-12 07:37:04 浏览: 232
以下是C++实现循环冗余校验(CRC)算法的示例代码:
```c++
#include <iostream>
#include <string>
#include <vector>
typedef unsigned char byte;
typedef unsigned int uint;
class CRC32 {
public:
CRC32() {
table.resize(256);
init_table();
reset();
}
void reset() {
crc = 0xFFFFFFFF;
}
void update(byte* data, uint len) {
for (uint i = 0; i < len; i++) {
crc = (crc >> 8) ^ table[(crc ^ data[i]) & 0xFF];
}
}
uint get_crc() {
return crc ^ 0xFFFFFFFF;
}
private:
uint crc;
std::vector<uint> table;
void init_table() {
uint poly = 0xEDB88320;
for (uint i = 0; i < 256; i++) {
uint c = i;
for (int j = 0; j < 8; j++) {
if (c & 1) {
c = poly ^ (c >> 1);
} else {
c >>= 1;
}
}
table[i] = c;
}
}
};
int main() {
std::string data = "hello world";
byte* data_ptr = reinterpret_cast<byte*>(const_cast<char*>(data.c_str()));
uint len = data.length();
CRC32 crc;
crc.update(data_ptr, len);
std::cout << "CRC32: " << std::hex << crc.get_crc() << std::endl;
return 0;
}
```
在这个示例代码中,我们使用了一个CRC32的实现,它使用了一个32位的CRC多项式(0xEDB88320),并且在初始化时生成了一个预处理表(table)来加速计算。在使用时,我们先调用reset()函数来重置CRC值,然后使用update()函数来更新CRC值,最后调用get_crc()函数来获取最终的CRC校验码。
注意:在实际使用中,我们可能需要根据具体的应用场景来选择合适的CRC多项式和预处理表。同时,由于多项式和预处理表的不同,不同的CRC实现之间可能会产生不同的校验码。
阅读全文