gpt4 book ai didi

c++ - C++ 中的校验和

转载 作者:太空狗 更新时间:2023-10-29 20:42:08 25 4
gpt4 key购买 nike

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

最佳答案

您可以使用 IPv4 header 中使用的校验和,它是 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 位值,因为最后一个缺失字符为零) .

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

如果你想测试你是否在这个过程中犯了错误,许多算法(循环)在你散列整个消息包括它的 CRC 之后输出零结果。如果您得到零,则表示消息未损坏或您的算法在测试时工作正常。

关于c++ - C++ 中的校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19821844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com