3

我需要用 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 的新手。

4

2 回答 2

5

您可以使用 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 在内的整个消息进行哈希处理后会输出零结果。如果你得到零,这意味着消息没有损坏,或者你的算法在你测试它时工作正常。

于 2013-11-06T20:25:04.827 回答
0

实现一个功能如下:

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

构造函数是否已经实现?

于 2013-11-06T20:25:17.873 回答