Go与Android的CRC32/Adler32算法使用

xcltapestry · · 4768 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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 ADLER32 int = 0
var CRC32 int = 1

func main() {
	for _, v := range []string{"aaaaaaaaaa", "3333sdfsdffsdffsd", "234esrewr234324", `An Adler-32 checksum is obtained by calculating two 16-bit checksums A and B and concatenating their bits into a 32-bit integer. A is the sum of all bytes in the stream plus one, and B is the sum of the individual values of A from each step.
					At the beginning of an Adler-32 run, A is initialized to 1, B to 0. The sums are done modulo 65521 (the largest prime number smaller than 216). The bytes are stored in network order (big endian), B occupying the two most significant bytes.
					The function may be expressed as
					A = 1 + D1 + D2 + ... + Dn (mod 65521)
					 B = (1 + D1) + (1 + D1 + D2) + ... + (1 + D1 + D2 + ... + Dn) (mod 65521)
					   = n×D1 + (n−1)×D2 + (n−2)×D3 + ... + Dn + n (mod 65521)
					 Adler-32(D) = B × 65536 + A
					where D is the string of bytes for which the checksum is to be calculated, and n is the length of D.`} {
		calc(ADLER32, []byte(v))
		calc(CRC32, []byte(v))
	}
}

func calc(t int, b []byte) {
	var ret uint32
	if ADLER32 == t {
		ret = adler32.Checksum([]byte(b))
		fmt.Printf("ADLER32 %15d  : %s...  \n", ret, string(b[:5]))
	} else if CRC32 == t {
		ret = crc32.ChecksumIEEE([]byte(b))
		fmt.Printf("CRC32   %15d  : %s...  \n", ret, string(b[:5]))
	} else {
		return
	}
}
      

     Android的就不举例了,相关包有详细说明:
CRC32:
http://wear.techbrood.com/reference/java/util/zip/CRC32.html
Adler32:
http://wear.techbrood.com/reference/java/util/zip/Adler32.html

两者效果都差不多,不过Adler32相对来说计算量会小些。 


BLOG: http://blog.csdn.net/xcl168





有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:xcltapestry

查看原文:Go与Android的CRC32/Adler32算法使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4768 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传