首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BOOST::CRC使用process.block()方法创建校验和

BOOST::CRC使用process.block()方法创建校验和
EN

Stack Overflow用户
提问于 2020-08-03 07:39:34
回答 1查看 254关注 0票数 1

我目前正在尝试在自定义的结构UMGR_s的长度上创建一个校验和,我使用了BOOST::crc方法process.block()和我的结构的开始和结束地址。

问题是,每次运行此方法时,我都会得到一个不同的校验和,即使结构中的数据保持一致。我不知道我在这里做了什么错事。

代码语言:javascript
复制
int checksum_manager::createCRC(UMGR_s *CRCdata)
{
    boost::crc_32_type result;

    result.process_block(CRCdata, CRCdata + 1);

    return result.checksum();
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-03 22:19:18

回顾你以前的问题:

代码语言:javascript
复制
#include <string>
#include <type_traits>

struct UMGR_s {
    std::string name;
    std::string description;
    std::string dlt_id;
    std::string log_mode;
    std::string log_level;
    std::string log_dir_path;
    uint ipc_port;
    uint reconnection_retry_offset;
    uint msg_buf_size;
    int checksum;
};

static_assert(std::is_standard_layout<UMGR_s>{});
static_assert(not std::is_trivial<UMGR_s>{});
static_assert(not std::is_pod<UMGR_s>{});

这不是POD。就像你已经注意到的那样,简单的闪电战是不可靠的。

将其视为C++对象并编写校验和函数,例如:

代码语言:javascript
复制
int calcCRC() {
    boost::crc_32_type crc;
    crc.process_bytes(name.data(), name.size());
    crc.process_bytes(description.data(), description.size());
    crc.process_bytes(dlt_id.data(), dlt_id.size());
    crc.process_bytes(log_mode.data(), log_mode.size());
    crc.process_bytes(log_level.data(), log_level.size());
    crc.process_bytes(log_dir_path.data(), log_dir_path.size());
    crc.process_block(&ipc_port, &ipc_port+1);
    crc.process_block(&reconnection_retry_offset, &reconnection_retry_offset+1);
    crc.process_block(&msg_buf_size, &msg_buf_size+1);

    return crc.checksum();
}

看吧,住在Coliru

该示例始终如一地返回0xbf21e978,并且没有UB或val差制/ASAN警告。

更好的是,减少错误的发生:

代码语言:javascript
复制
struct CRC {
    boost::crc_32_type crc;
    void operator()(std::string_view s) {
        crc.process_bytes(s.data(), s.size());
    }
    template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
    void operator()(T const& i) {
        static_assert(std::is_trivial_v<T>);
        static_assert(not std::is_class_v<T>);
        crc.process_bytes(&i, sizeof(i));
    }

    auto get() { return crc.checksum(); }
};

这意味着你现在可以“只是”写:

代码语言:javascript
复制
int calcCRC() {
    CRC crc;
    crc(name);
    crc(description);
    crc(dlt_id);
    crc(log_mode);
    crc(log_level);
    crc(log_dir_path);
    crc(ipc_port);
    crc(reconnection_retry_offset);
    crc(msg_buf_size);

    return crc.get();
}

现场演示

住在Coliru

代码语言:javascript
复制
#include <string>
#include <iostream>
#include <type_traits>
#include <boost/crc.hpp>

struct CRC {
    boost::crc_32_type crc;
    void operator()(std::string_view s) {
        crc.process_bytes(s.data(), s.size());
    }
    template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
    void operator()(T const& i) {
        static_assert(std::is_trivial_v<T>);
        static_assert(not std::is_class_v<T>);
        crc.process_bytes(&i, sizeof(i));
    }

    auto get() { return crc.checksum(); }
};

struct UMGR_s {
    std::string name;
    std::string description;
    std::string dlt_id;
    std::string log_mode;
    std::string log_level;
    std::string log_dir_path;
    uint ipc_port;
    uint reconnection_retry_offset;
    uint msg_buf_size;
    int checksum;

    int calcCRC() {
        CRC crc;
        crc(name);
        crc(description);
        crc(dlt_id);
        crc(log_mode);
        crc(log_level);
        crc(log_dir_path);
        crc(ipc_port);
        crc(reconnection_retry_offset);
        crc(msg_buf_size);

        return crc.get();
    }
};

static_assert(std::is_standard_layout<UMGR_s>{});
static_assert(not std::is_trivial<UMGR_s>{});
//static_assert(not std::is_pod<UMGR_s>{});

int main() {
    UMGR_s data {
         "UMGR",
         "UpdateManager",
         "1234",
         "kConsole",
         "kVerbose",
         "",
         33,
         0,
         1000,
         0,
    };

    data.checksum = data.calcCRC();

    std::cout << "crc: " << std::hex << std::showbase << data.checksum << "\n";
}

注意到它仍然打印相同的CRC:

代码语言:javascript
复制
crc: 0xbf21e978
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63225515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档