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

标签 c++ checksum

我需要帮助用 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/

相关文章:

file-io - 通过 CRC 比较文件

c++ - 在 MSVC 2017 中继承模板构造函数和错误 C2600

c++ - 具有许多成员变量的类的最佳实践

filesystems - 为什么文件校验和会不一致地失败?

java - 使用加密哈希函数之前和之后

haskell - 为什么 ICMP 校验和移位 16 位

c++ - 为什么 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern?

c++ - 不规则形状的 OpenCV 直方图

c++ - 为什么不能将反向迭代器转换为正向迭代器?

md5 - adler32 校验和的可靠性如何?