Boost CRC каждый раз дает разные результаты - PullRequest
0 голосов
/ 21 ноября 2018

Фон

Я пытаюсь вычислить 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);
}

Issue

Каждый раз, когда я запускал мой тест, вычисленный 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 Ответ

0 голосов
/ 21 ноября 2018
&input

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

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

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

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