c++ - boost crc 每次产生不同的输出

标签 c++ boost crc16 catch-unit-test

背景

我正在尝试使用 boost crc 库计算给定字节数组的 CRC-16/CRC2。

注意:我充其量是C++开发的初学者

#include <iostream>
#include <vector>
#include <boost/crc.hpp>

namespace APP{
    class CrcUtil{
        public:
            static uint16_t crc16(const std::vector<uint8_t> input) {
                boost::crc_16_type result;
                result.process_bytes(&input, input.size());
                return result.checksum();
            }

            CrcUtil()=delete;
    };
};

我使用 catch2 作为我的测试框架。下面是测试代码:

#include "catch.hpp"

#include "../include/crcUtil.h"

TEST_CASE("is crc calculation correct", "[crcUtil.h TESTS]"){
    std::vector<uint8_t> bytes = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    auto expectedCRC2 = 0x3c9d;
    auto actualCRC2 = APP::CrcUtil::crc16(bytes);

    REQUIRE(expectedCRC2 == actualCRC2);
}

问题

每次我运行测试时计算出的 CRC 都是不同的。

第一次运行:

/.../test/crcUtilTests.cpp:10: FAILED:
    REQUIRE( expectedCRC2 == actualCRC2 )
with expansion:
    15517 (0x3c9d) == 63180

第二次运行:

/.../test/crcUtilTests.cpp:10: FAILED:
    REQUIRE( expectedCRC2 == actualCRC2 )
with expansion:
    15517 (0x3c9d) == 33478

第N次运行:

/.../test/crcUtilTests.cpp:10: FAILED:
    REQUIRE( expectedCRC2 == actualCRC2 )
with expansion:
    15517 (0x3c9d) == 47016

问题

我的代码有问题吗?

为什么相同输入的 CRC16 不同?

如何为给定的字节数组可靠地计算 CRC16?

最佳答案

&input

不会为您提供指向数据缓冲区的指针!它为您提供了一个指向 vector 对象本身的指针,因此您将该对象的内部解释为数据缓冲区。每次都会不同,因为它包含诸如动态分配的指向真实数据缓冲区的指针之类的东西。

此外,vector 的对象表示可能与 input.size() 的大小不同,并且可能有一些 padding bytes。也。所以很可能你也在调用 Undefined Behaviour通过读取未初始化的内存,这意味着您的程序完全无效并且任何事情都可能发生(包括看似正常工作)。

使用input.data()获取指向所含数据的指针,如下所示:

result.process_bytes(input.data(), input.size());

关于c++ - boost crc 每次产生不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408338/

相关文章:

python - 使用 Boost.Python 通过引用/指针将 C++ 对象传递给 Python 解释器

microcontroller - CRC16 校验和 : HCS08 vs. Kermit 与 XMODEM

c++ - 难以理解链表实现(结构部分)?

c++ - std::deque::erase 函数的时间复杂度是多少?

c++ - 在类模板实例化中携带类型信息

c++ - 在 3 元素映射 C++ 中添加新项目并使用时间键搜索

C++ 程序在 COM 端口读取期间卡住

c++ - boost 对散列唯一索引的多索引访问

java - java中计算16位CRC并将其附加到字节数组的末尾

c - 如何调整CRC32与CRC16的调节因子计算?