我需要帮助用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的新手。
答案 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.
}
构造函数是否已经实现?