CRC32相关

CRC即循环冗余校验码(Cyclic Redundancy Check)。

CRC32算法中,这个生成多项式为:
c(x) = 1 + x + x^2 + x^4 + x^5 + x^7 + x^8 + x^10 + x^11 + x^12 + x^16 + x^22 + x^23 + x^26 + x^32。
其对应的数字就为:11101101101110001000001100100000(x^32在实际计算时隐含给出,因此这里没有包含它
的系数),也就是0xEDB88320(多项式对应的数字可能颠倒,颠倒后得到的是0x04C11DB7,其实也是正确的)。
由此可以看出,CRC值也可以看成我们的数据除以一个生成多项式而得到的余数。

容易理解的是位运算

  1. // 以4 byte数据为例
  2. #define POLY 0x04C11DB7L // CRC32生成多项式
  3. unsigned int CRC32_1(unsigned int data)
  4. {
  5. unsigned char p[8];
  6. memset(p, 0, sizeof(p));
  7. memcpy(p, &data, 4);
  8. unsigned int reg = 0, idx = 0;
  9. for(int i = 0; i < 64; i++)
  10. {
  11. idx = i/8;
  12. int hi = (reg>>31)&0x01; // 取得reg的最高位
  13. // 把reg左移1bit,并移入新数据到reg0
  14. reg = (reg<<1)| (p[idx]>>7);
  15. if(hi) reg = reg^POLY; // hi=1就用reg除以g(x)
  16. p[idx]<<=1;
  17. }
  18. return reg;
  19. }

位运算速度慢,扩展到字节为单位

// 以4 byte数据为例
#define POLY 0x04C11DB7L // CRC32生成多项式
unsigned int CRC32_2(unsigned int data)
{
    unsigned char p[8];
    memset(p, 0, sizeof(p));
    memcpy(p, &data, 4);
    unsigned int reg = 0, sum_poly = 0;
    for(int i = 0; i < 8; i++)
    {
        // 计算步骤1
        sum_poly = reg&0xFF000000;
        for(int j = 0; j < 8; j++)
        {
            int hi = sum_poly&0x80000000; // 测试reg最高位
            sum_poly <<= 1;
            if(hi) sum_poly = sum_poly^POLY;
        }
        // 计算步骤2
        reg = (reg<<8)|p[i];
        reg = reg ^ sum_poly;
    }
    return reg;
}
但实际使用的是一种表驱动的方式,

static void init_crc_table(void)
{
    unsigned int c;
    unsigned int i, j;
    
    for (i = 0; i < 256; i++) {
        c = (unsigned int)i;
        for (j = 0; j < 8; j++) {
            if (c & 1)
                c = 0xedb88320L ^ (c >> 1);
            else
                c = c >> 1;
        }
        crc_table[i] = c;
    }
}

/*计算buffer的crc校验码*/
static unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size)
{
    unsigned int i;
    for (i = 0; i < size; i++) {
        crc = crc_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
    }
    return crc ;
}

时间: 2024-12-26 02:48:09

CRC32相关的相关文章

pt-table-checksum检测不出主从差异处理

几个月前写过pt-table-checksum 3.0.4检测不出主从差异数据,当时的解决方案是使用旧版本,另一个挫方法是自行设置binlog_format='STATEMENT'.现在已经发布到3.0.9版本,原以为官方修复那个问题,结果还是一样的坑~最近几版pt-table-checksum在binlog_format='row',且主从存在差异数据时,却检测不出主从差异.原因就是主上没有SET @@binlog_format := 'STATEMENT',导致下面两个核心语句不是以stat

关于对H264码流的TS的封装的相关代码实现

1 写在开始之前 在前段时间有分享一个H264封装ps流到相关文章的,这次和大家分享下将H264封装成TS流到相关实现,其实也是工作工作需要.依照上篇一样,分段说明每个数据头的封装情况,当然,一样也会加上rtp头,方便以后的这方面到需求,如果开发不需要的话,可   以自行屏蔽掉,当然需要主要buffer指针的移动情况 2 封装的各个头到规则要点 整个封装过程也是和ps类似,但是最大到区别在于TS流到数据长度都是固定188大小来传输的,而PS流则是可变包结构,正因为两者在结构上到差异,导致了它们在

mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)

binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计.binary log 相关参数:log_bin设置此参数表示启用binlog功能,并指定路径名称log_bin_index设置此参数是指定二进制索引文件的路径与名称binlog_do_db此参数表示只记录指定数据库的二进制日志binlog_ignore_db此参数表示不记录指定的数据库的二进制日志max_binlog_cache_size此参数表示binlog使用的内存最大的尺寸binlog_cache_size此

MySQL 5.7 Replication 相关新功能说明

背景: MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等.因为都是和复制相关,所以本文将针对这些新特性放一起进行说明,篇幅可能稍长,本文使用的MySQL版本是5.7.13. 1,多源复制(多主一从) MySQL在5.7之后才支持多源复制,之前介绍过MariaDB 多主一从 搭建测试说明,现在介绍如何在MySQL上做多主一从,具体的方法说明可以查看官方文档. 原理:多源复制加入

Go与Android的CRC32/Adler32算法使用

Packet在网络传输中必须要考虑万一数据损坏的情况,CRC32与Adler32都是最常用的算法. Go与Android都内置好了这两种算法的实现,直接使用就好. Go的调用方式如下: // 校验算法(ADLER32/CRC32)例子 //author: Xiong Chuan Liang //date: 2015-4-12 package main import ( "fmt" "hash/adler32" "hash/crc32" ) var

数据摘要算法的测试效率(SHA、MD5和CRC32)

1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(Hash)算法或散列算法. 1.1 CRC8.CRC16.CRC32 CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产生一个4字节(32位)的校验值,一般是以8位十六进制数,如FA 12

Nginx 之四: Nginx服务器的rewrite、全局变量、重定向和防盗链相关功能

一:Nginx 后端服务器组的配置: 1.upstream: 用于设置后端服务器组的主要指令,upstream类似于之前的server块或http块,用法如下: upstreame Myserver{ #ip_hash; #least_conn: #fair; #hash $request_uri; #hash_method crc32; server 192.168.0.2:8080 #weight 2 max_fails 3 fail_timeout 60; 192.168.0.3:8080

zip相关知识梳理(一)

zip相关知识梳理(一) 经过对zip文件的长时间研究,对zip文件进行相关知识进行梳理,虽然网上很多牛人对其做了相关基础解析,但是对于特殊情况没有进行说明,比如超过4G的zip文件该以什么格式进行编译,现本人对其进行详细讲解.如有不足,欢迎各位大神指点! 一.zip文件格式 zip文件格式: [本地文件头1] [档案数据1] [数据描述符1] . . . [本地文件头n] [档案数据n] [数据描述符n] [存档解密标题](EFS) [存档额外数据记录](EFS) [中央目录] [zip64中

【Windows10&nbsp;IoT开发系列】PowerShell的相关配置

原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShell 是基于任务的命令行 Shell 和脚本语言,专为进行系统管理而设计. 1.​启动 PowerShell (PS) 会话 注:若要使用装有Windows10 IoT Core设备启动PS会话,首先需要在主机电脑与设备之间创建信任关系. ​启动 Windows IoT 核心版设备后,与该设备相连的