栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

360行车记录仪项目开发日志(服务端开发)(三)32位CRC校验 c++代码实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

360行车记录仪项目开发日志(服务端开发)(三)32位CRC校验 c++代码实现

传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 

我的服务器开发选用32位的CRC校验来检验数据是否有误,CRC校验原理就不过多介绍。

CRC校验代码
#include 
#include 
using namespace std;
typedef unsigned int uint;
uint POLYNOMIAL = 0xEDB88320;
int have_table = 0;
double pi = 3.14159265359;
uint table[256];//CRC校验码表
//⽣成table
void make_table()
{
	int i, j, crc;
	have_table = 1;
	for (i = 0; i < 256; i++)
		for (j = 0, table[i] = i; j < 8; j++)
			table[i] = (table[i] >> 1) ^ ((table[i] & 1) ? POLYNOMIAL : 0);
}
//校验
uint crc32(uint crc, char* buff, int len)
{
	if (!have_table) make_table();
	crc = ~crc;
	for (int i = 0; i < len; i++)
		crc = (crc >> 8) ^ table[(crc ^ buff[i]) & 0xff];
	return ~crc;
}

int main()
{
	uint crc;
	char buf[20] = { "adecs" };
	cout << hex << crc32(crc, buf, strlen(buf)) << endl;
	printf("%08Xn", crc32(crc, buf, strlen(buf)));
	return 0;
}
运行结果

 CRC校验码会因为buf数据的不同而变化,如果在传输过程中,数据有变化,则发送端和接收端的校验码会有差异,以此来检查数据在传输过程中是否有损坏。

如果有需要详细代码,可以下载以下资源

(48条消息) CRC-32,CRC-8校验c++实现.pdf-C++文档类资源-CSDN文库

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号