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 для данного байтового массива?

1 ответ

Решение
&input

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

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

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

result.process_bytes(input.data(), input.size());
Другие вопросы по тегам