CRC计算模板适用于除CRC8以外的所有类型
CRC calculation template works for all types except CRC8
我不知道这里是问这个问题的合适地方,还是应该在代码审查时问这个问题。无论如何,我已经编写了以下代码来计算各种类型的CRC。其CRC16、CRC32和CRC64的结果与在线实现(如此处和此处)相匹配。但对于CRC8,无论我设置了参数,结果都不匹配。我不是循环冗余检查细节方面的专家,只是读了维基百科文章的一部分。有人能告诉我我的代码出了什么问题吗?
#include <cstdio>
#include <string>
#include <stdint.h>
namespace crc
{
namespace templates
{
template <typename T> struct crcdata
{
T number = 0;
std::string toHex(void)
{
std::string s(2 * sizeof(T), '0');
for (T n = number, i = s.size(); n; n >>= 4)
s[--i] += (n & 0xF) > 9 ? (n % 16 - 9) | 16 : n % 16;
return s;
}
};
template <typename T, T polynomial, T init_cr, T final_cr>
class general_crc
{
public:
inline general_crc()
{
static T table[256];
/// build CRC lookup table. Skip the loop if already evaluated
for (int i = 0, b = 0; i < 256 && !table[255]; b = 8, i++)
{
table[i] = i;
while (b--) table[i] = (table[i] >> 1) ^ (table[i] & 1 ? polynomial : 0);
}
this->result.number = init_cr;
this->crc_table = (T const*)(void*)&table[0];
}
virtual ~general_crc(){}
private:
T const* crc_table;
crcdata <T> result;
void crc_calc(const void* buf, size_t size)
{
uint8_t* p = (uint8_t*)buf;
while (size--)
this->result.number = this->crc_table[(this->result.number ^ *p++) & 0xFF] ^ (this->result.number >> 8);
}
public:
/// crc of string
static crcdata <T> calculate(const std::string& s)
{
general_crc cr;
cr.crc_calc(s.c_str(), s.size());
cr.result.number ^= final_cr;
return cr.result;
}
};
}
typedef templates::general_crc <uint8_t, 0xAB, 0, 0> CRC8;
typedef templates::general_crc <uint16_t, 0xA001, 0, 0> CRC16;
typedef templates::general_crc <uint32_t, 0xEDB88320U, 0xFFFFFFFFU, 0xFFFFFFFFU> CRC32;
typedef templates::general_crc <uint64_t, 0xC96C5795D7870F42LLU, ~0LLU, ~0LLU> CRC64;
}
#include <iostream>
int main()
{
std::string test = "This is a test!!";
std::cout << crc::CRC8::calculate(test).toHex() << 'n';
std::cout << crc::CRC16::calculate(test).toHex() << 'n';
std::cout << crc::CRC32::calculate(test).toHex() << 'n';
std::cout << crc::CRC64::calculate(test).toHex() << 'n';
return 0;
}
代码或结果没有任何问题。你认为你应该得到什么,为什么?
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- CRC计算模板适用于除CRC8以外的所有类型