Boost CRC каждый раз дает разные результаты

Фон

Я пытаюсь рассчитать 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 для данного байтового массива?

3

Решение

&input

Это делает не дать вам указатель на буфер данных! Это дает вам указатель на vector сам объект, так что вы интерпретируете внутренности этого объекта как буфер данных. Он будет отличаться каждый раз, потому что содержит такие вещи, как динамически размещенные указатели на реальный буфер данных.

Кроме того, объектное представление vector вероятно, не такой же размер, как input.size()и может иметь некоторые байты заполнения тоже. Так что, скорее всего, вы также вызываете Неопределенное поведение читая неинициализированную память, то есть ваша программа полностью недействительна а также может произойти все, что угодно (в том числе и работает нормально).

использование input.data() чтобы получить указатель на содержащиеся данные, например:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]