Фон
Я пытаюсь рассчитать CRC-16 / CRC2 для данного байтового массива с помощью Boost CRC Lib.
Примечание: я новичок в лучшем случае в разработке 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()
и может иметь некоторые байты заполнения тоже. Так что, скорее всего, вы также вызываете Неопределенное поведение читая неинициализированную память, то есть ваша программа полностью недействительна а также может произойти все, что угодно (в том числе и работает нормально).
использование input.data()
чтобы получить указатель на содержащиеся данные, например:
result.process_bytes(input.data(), input.size());
Других решений пока нет …