C ++中的校验和

时间:2013-11-06 20:12:36

标签: c++ checksum

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

想法是从用户(字符串)获取数据输入,将其转换为二进制形式,然后计算校验和并将其放入我的数据包中。我没有任何校验和类型规范......我认为XORing 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的新手。

2 个答案:

答案 0 :(得分:4)

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

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

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

如果你用Google搜索,你可以找到更多算法:

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

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

要实现您的功能,只需先按顺序转换String message中的每对字符,然后将其输入校验和算法。

如果您有一个奇数字节,则必须将最后一个字节正确填零(检查您选择的单个算法的文档,或者只计算最后一对的16位值,因为最后一个丢失的字符为零)

处理完邮件后,将seq编号添加到has并将校验和结果存储在checksum变量中。

如果要测试是否在过程中出错,许多算法(循环)在散列整个消息(包括CRC)后会输出零结果。如果你得到零,则意味着消息没有损坏,或者你的算法在测试时算法正常。

答案 1 :(得分:1)

实现一个功能如下:

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

构造函数是否已经实现?