Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 升压CRC 16位_C++_Boost_Crc16 - Fatal编程技术网

C++ 升压CRC 16位

C++ 升压CRC 16位,c++,boost,crc16,C++,Boost,Crc16,使用在线crc计算器,我知道crc-CCITT(0xFFFF)的32311e33530(十六进制)=E558(十六进制)。如何使用boost crc执行此操作 std::string crc_str = "32311E333530"; boost::crc_16_type result; result.process_bytes(crc_str.data(), crc_str.length()); std::cout << "checksum = "

使用在线crc计算器,我知道crc-CCITT(0xFFFF)的
32311e33530
(十六进制)=
E558
(十六进制)。如何使用boost crc执行此操作

    std::string crc_str = "32311E333530";
    boost::crc_16_type result;
    result.process_bytes(crc_str.data(), crc_str.length());
    std::cout << "checksum = " << result.checksum();

已更新

您将ascii字符串与字节数组混淆。不一样

这将产生您期望的结果:

int main()
{
    const unsigned char data[] = {0x32, 0x31, 0x1E, 0x33, 0x35, 0x30};
    boost::crc_ccitt_type result;
    result.process_bytes(data, 6);
    std::cout << "checksum = " << std::hex << result.checksum() << std::endl;
    return 0;
}
印刷品:

checksum = ddf6
使用crc\u ccitt\u类型通过Boost运行相同的字符串,如下所示:

int main()
{
    std::string crc_str = "32311E333530";
    boost::crc_ccitt_type result;
    result.process_bytes(crc_str.data(), crc_str.length());
    std::cout << "checksum = " << std::hex << result.checksum() << std::endl;
    return 0;
}
因此,Boost代码与串行手册中的代码输出相匹配

在中键入
32311e33530
(无引号)将生成以下内容:

"32311E333530"
1 byte checksum 112
CRC-16  0xE8C5
CRC-16 (Modbus) 0xEAA1
CRC-16 (Sick)   0x9254
CRC-CCITT (XModem)  0x590F
CRC-CCITT (0xFFFF)  0xDDF6
CRC-CCITT (0x1D0F)  0xF065
CRC-CCITT (Kermit)  0xF2EC
CRC-DNP 0x8034
CRC-32  0xFB5DA62C
请注意,CRC-16是
E8C5
——正如您最初的boost代码所报告的那样。CRC-CCITT也匹配


那么问题是什么?ccitt的boost代码与手册代码和在线工具都匹配。crc-16的增强结果也与我的在线计算器所说的相符。

更新了

您将ascii字符串与字节数组混淆。不一样

这将产生您期望的结果:

int main()
{
    const unsigned char data[] = {0x32, 0x31, 0x1E, 0x33, 0x35, 0x30};
    boost::crc_ccitt_type result;
    result.process_bytes(data, 6);
    std::cout << "checksum = " << std::hex << result.checksum() << std::endl;
    return 0;
}
印刷品:

checksum = ddf6
使用crc\u ccitt\u类型通过Boost运行相同的字符串,如下所示:

int main()
{
    std::string crc_str = "32311E333530";
    boost::crc_ccitt_type result;
    result.process_bytes(crc_str.data(), crc_str.length());
    std::cout << "checksum = " << std::hex << result.checksum() << std::endl;
    return 0;
}
因此,Boost代码与串行手册中的代码输出相匹配

在中键入
32311e33530
(无引号)将生成以下内容:

"32311E333530"
1 byte checksum 112
CRC-16  0xE8C5
CRC-16 (Modbus) 0xEAA1
CRC-16 (Sick)   0x9254
CRC-CCITT (XModem)  0x590F
CRC-CCITT (0xFFFF)  0xDDF6
CRC-CCITT (0x1D0F)  0xF065
CRC-CCITT (Kermit)  0xF2EC
CRC-DNP 0x8034
CRC-32  0xFB5DA62C
请注意,CRC-16是
E8C5
——正如您最初的boost代码所报告的那样。CRC-CCITT也匹配


那么问题是什么?ccitt的boost代码与手册代码和在线工具都匹配。crc-16的提升结果也符合我的在线计算器所说的。

你真的不想要crc\U 16\U类型,是吗?您需要crc\u ccitt\u类型,因为您尝试匹配的crc是crc-CCITT@JerryJeremiah非常感谢。我也有同样的想法;校验和等于56822;也许我遗漏了一些特定于
0xFFFF
格式的步骤?我想是的,根据字符串“123456789”的结果:CRC-CCITT(XModem)=0x31C3,CRC-CCITT(0xFFFF)=0x29B1,CRC-CCITT(0x1D0F)=0xE5CC和CRC-CCITT(Kermit)=0x8921,所以它们中有一些是必需的。请注意,您的输入字符串不是323。。。十六进制,但323的ASCII字符。。。这会产生一个不同于预期的CRC。您不需要CRC\u 16\u类型,是吗?您需要crc\u ccitt\u类型,因为您尝试匹配的crc是crc-CCITT@JerryJeremiah非常感谢。我也有同样的想法;校验和等于56822;也许我遗漏了一些特定于
0xFFFF
格式的步骤?我想是的,根据字符串“123456789”的结果:CRC-CCITT(XModem)=0x31C3,CRC-CCITT(0xFFFF)=0x29B1,CRC-CCITT(0x1D0F)=0xE5CC和CRC-CCITT(Kermit)=0x8921,所以它们中有一些是必需的。请注意,您的输入字符串不是323。。。十六进制,但323的ASCII字符。。。这会产生一个不同于预期的CRC。我明白了。非常感谢。如果单击“输入类型为十六进制”,您将看到它。因此,如果我从ASCII字符串中获得结果,如何按照我的手册建议将DDF6或56822转换为所需的E558?为什么期望E558?这显然是错误的。你在问题中提到的“在线计算器”是什么?哦,我明白你的问题了。您将ASCII字符串与二进制字符串混淆。等等我会更新答案的;如果我在crc之前将
32311e33530
转换为二进制,那么校验和将显示为
58712
你看-答案更新。给我一些绿色支票!我懂了。非常感谢。如果单击“输入类型为十六进制”,您将看到它。因此,如果我从ASCII字符串中获得结果,如何按照我的手册建议将DDF6或56822转换为所需的E558?为什么期望E558?这显然是错误的。你在问题中提到的“在线计算器”是什么?哦,我明白你的问题了。您将ASCII字符串与二进制字符串混淆。等等我会更新答案的;如果我在crc之前将
32311e33530
转换为二进制,那么校验和将显示为
58712
你看-答案更新。给我一些绿色支票!