boost crc 每次产生不同的输出
boost crc yields different output each time
背景
我正在尝试使用 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 too. So most likely you are also invoking Undefined Behaviour 通过读取未初始化的内存,这意味着 你的程序完全无效并且任何事情都可能发生(包括看起来正常工作)。
使用input.data()
获取指向包含数据的指针,如下所示:
result.process_bytes(input.data(), input.size());
背景
我正在尝试使用 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 too. So most likely you are also invoking Undefined Behaviour 通过读取未初始化的内存,这意味着 你的程序完全无效并且任何事情都可能发生(包括看起来正常工作)。
使用input.data()
获取指向包含数据的指针,如下所示:
result.process_bytes(input.data(), input.size());