【问题标题】:Checksum in C++C++ 中的校验和
【发布时间】:2013-11-06 20:12:35
【问题描述】:

我需要帮助我用 C++ 编写代码来执行 16 位校验和。

想法是从用户(字符串)获取数据输入,将其转换为二进制形式,然后计算校验和并将其放入我的数据包中。我没有任何校验和类型规范……我认为异或 16 位是个好主意。我有以下课程包:

class packet
{
private:
    string message;
    unsigned int checksum;  // this is a 16 bit checksum
    unsigned int seqNum;

public:
    packet(string str, unsigned int seq);
    void setMessage(string str);
    void setSeqNum(unsigned int num);
    string getMessage();
    int getLength();
    unsigned int calculateChecksum();
    int getChecksum();
    bool getSeqNum();
};

鉴于上述情况,我必须在这里计算我的校验和:

packet::packet(string str, unsigned int seq)
{
    this->message = str;
    this->seqNum = seq;
    // calculate checksum here
    checksum = calculateChecksum(); //HOW TO CODE THIS FUNCTION?
}

请帮忙。我是 C++ 和 C 的新手。

【问题讨论】:

  • 查看 fletcher 的校验和。

标签: c++ checksum


【解决方案1】:

您可以使用 IPv4 标头中使用的校验和,它是 16 位:

http://en.wikipedia.org/wiki/IPv4_header_checksum

或查看 CRC16: http://en.wikipedia.org/wiki/Crc16

如果你用谷歌搜索一下,你可以找到更多算法:

http://en.wikipedia.org/wiki/List_of_hash_functions

http://en.wikipedia.org/wiki/Category:Checksum_algorithms

要实现您的功能,只需先按顺序转换String message 中的每一对字符并将其提供给校验和算法。

如果您有奇数个字节,则必须正确地将最后一个字节补零(检查文档以了解您选择的个人算法,或者只计算最后一对的 16 位值,因为最后一个缺失字符为零) .

处理完消息后,将序列号添加到 has 并将校验和结果存储在 checksum 变量中。

如果您想测试您是否在该过程中犯了错误,许多算法(循环)在您对包括其 CRC 在内的整个消息进行哈希处理后会输出零结果。如果你得到零,则意味着消息没有损坏,或者你的算法在你测试时工作正常。

【讨论】:

    【解决方案2】:

    实现一个函数如下:

    unsigned int packet::calculateChecksum()
    {
        // here you can use the members of packet, make a for-loop and other things.
    }
    

    构造函数已经实现了吗?

    【讨论】:

    • 是的,它在那里,但我必须填写校验和部分,并将序列号和原始数据(转换为二进制形式)添加到它,并将整个东西变成一个数据包。所以我卡在校验和上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多