文档章节

CRC32源码

h
 houj
发布于 2014/10/29 16:57
字数 300
阅读 126
收藏 0

CRC32源码

C语言版

static u32 CRC32[256];
static bool init = 0;

//初始化表,在单片机等RAM较小的系统,可以在源码中把tab构造为const数组
static void init_table() {
   for (int i = 0; i < 256; i++) {
      u32 crc = i;
      for (int j = 0; j < 8; j++) {
         if (crc & 1) {
            crc = (crc >> 1) ^ 0xEDB88320;
         }
         else {
            crc = crc >> 1;
         }
      }
      CRC32[i] = crc;
   }
}

//crc32实现函数
u32 crc32(const u8* buf, int len) {
   u32 ret = 0xFFFFFFFF;
   if (!init) {
      init_table();
      init = true;
   }
   for (int i = 0; i < len; i++) {
      ret = CRC32[((ret & 0xFF) ^ buf[i])] ^ (ret >> 8);
   }
   ret = ~ret;
   return ret;
}

纯JAVA版

/**
 * 纯java实现的CRC32
 * @author houj
 *
 */
public class Crc32 {
   static int[] CRC32 = new int[256];
   static boolean init = false;

   /**
    * 初始化表
    */
   static void init_table() {
      for (int i = 0; i < 256; i++) {
         int crc = i;
         for (int j = 0; j < 8; j++) {
            if ((crc & 1) != 0) {
               crc = (crc >>> 1) ^ 0xEDB88320;
            } else {
               crc = crc >>> 1;
            }
         }
         CRC32[i] = crc;
      }
   }

   /**
    * crc32实现函数
    * 
    * @param buf
    * @param len
    * @return
    */
   public static int crc32(byte[] buf, int len) {
      int ret = 0xFFFFFFFF;
      int i;
      if (!init) {
         init_table();
         init = true;
      }
      for (i = 0; i < len; i++) {
         ret = CRC32[(((ret & 0xFF) ^ buf[i])) & 0xFF] ^ (ret >>> 8);
      }
      ret = ~ret;
      return ret;
   }

   /**
    * 测试
    * 
    * @param args
    */
   public static void main(String[] args) {
      // 构造数据
      byte[] bs = new byte[4096];
      new java.util.Random().nextBytes(bs);
      
      //纯java实现
      int r = crc32(bs, bs.length);
      System.out.println(r);

      //java原生实现
      java.util.zip.CRC32 c3 = new java.util.zip.CRC32();
      c3.reset();
      c3.update(bs, 0, bs.length);
      int r2 = (int) c3.getValue();
      System.out.println(r2);
      
      System.out.println("OK:"+(r==r2));
   }
}

© 著作权归作者所有

h
粉丝 9
博文 81
码字总数 57985
作品 0
长沙
技术主管
私信 提问
使用 Rust + WebAssembly 编写 crc32

使用 Rust + WebAssembly 编写 crc32 const POLY = 0xedb88320;const TABLE = makeTable(POLY);const TABLE8 = (function () {const tab = Array(8);for (let i = 0; i < 8; i++) { }tab[0] ......

神机算子
2018/10/23
0
0
crc32在做一致性哈希以及哈希环中遇到的坑

公司的项目大量用到Redis,而我们的Redis一般可能有很多组构成,多的有十几台,我们日常业务经常会碰到要去服务器查数据的问题,因此一台一台的去找会显得很慢。因为之前在学golang开发,我就...

tree2013
2016/11/27
1K
0
android apk 防止反编译技术第五篇-完整性校验

关于防止android apk被反编译的技术我们前面已经讲了四种。 加壳技术 运行时修改字节码 伪加密 对抗JD-GUI 如果有不明白的可以查看我的博客的前四篇中关于这四种技术的介绍。接下来我们接着介...

lonely1986
2015/04/27
9.9K
5
ceph jewel手动编译安装的一些优化

一、手动安装ceph。 根据http://my.oschina.net/linuxhunter/blog/682013,手动安装jewel版本ceph到硬件服务器。 二、测试ceph集群的方法。 使用ceph自带的rados bench命令简单测试手动搭建c...

linuxhunter
2016/06/02
996
0
在windows安装memcache

linux下的Memcache安装: 1. 下载 memcache的linux版本,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent。 2. 安装 pecl::memcache。 用 pecl 命令行工具安装: pecl i...

ZhaoChengye
2010/04/20
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
27分钟前
6
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
40分钟前
536
20
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
今天
5
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
今天
5
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部