- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要帮助用 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/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!