Java 实现校验和(Checksum)

本文简要解释什么是校验和以及如何在java中计算校验和。

1. 校验和及实现算法

校验和是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。简言之,校验和是二进制数据流的迷你表示。

在网络编程中通常用于检查信息是否完整接收,在接收到新消息时,可以重新计算校验和并与接收到的校验和进行比较,以确保没有丢失任何字节位。此外,它们还可以用于文件管理,例如,比较文件或检测更改。

常用创建校验和的算法有Adler32 和 CRC32。这些算法的工作原理是将一系列数据或字节转换成更小的字母和数字序列。它们被设计成输入中的任何微小变化都会导致计算出的校验和大不相同。
本文介绍Java支持的CRC32算法。需要指出的是CRC32算法用于计算校验和非常有用,但不建议用于摘要算法,如密码摘要。

2. CRC32算法示例

2.1 求字符串或字节数组校验和

首先需要获得需要计算校验和的输入,如何是字符串,则需要调用getBytes()获取字节数组:

String test = "test";
byte[] bytes = test.getBytes();

接下来通过字节数组计算校验和:

public static long getCRC32Checksum(byte[] bytes) {Checksum crc32 = new CRC32();crc32.update(bytes, 0, bytes.length);return crc32.getValue();
}

这里使用java内置的CRC32类。实例化之后使用update方法,传入字节数组计算校验和。简单地说,update方法将替换CRC32对象所保存的字节,这有助于代码重用并消除创建校验和新实例的需要。CRC32类提供了一些被重写的方法,用于替换整个字节数组或其中的几个字节。最后通过getValue方法返回校验和。

2.2 求输入流校验和

当处理较大数据集时,上述方法因加载所有数据至内存导致效率低下。
如果可以获取InputStream,可以使用CheckedInputStream 类创建创建校验和。通过使用这种方法,我们可以定义一次处理多少字节。
下面例子处理给定一次那些处理字节的数量,直到流结束:

public static long getChecksumCRC32(InputStream stream, int bufferSize) throws IOException {CheckedInputStream checkedInputStream = new CheckedInputStream(stream, new CRC32());byte[] buffer = new byte[bufferSize];while (checkedInputStream.read(buffer, 0, buffer.length) >= 0) {}return checkedInputStream.getChecksum().getValue();
}

3. 总结

本文我们介绍了校验和的概念,以及如何使用Java CRC32类计算字节数组或输入流(InputStream)的校验和。

Java 实现校验和(Checksum)相关推荐

  1. 校验和(Checksum)算法-概述

    校验和(Checksum)算法-概述 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 1.什么是校验和(Checksum) Check ...

  2. 校验和checksum (SCL算法)

      1.关于校验和,checksum可以看通讯协议部分,对其的解释,大部分是串口仪表的,自由口通讯校验算法,这里不做过多描述,直接上代码,博图里可能还有其它写法,但是可能都不是很方便,主要是ACSCI ...

  3. 校验和checksum算法

    原文地址:https://blog.csdn.net/zjli321/article/details/74908451 前言: 在网络中传输数据包,为了保证传输数据的正确性,使用了 checksum来 ...

  4. java使用CRC32计算校验和

    校验和checkSum指的是通过一定的算法,将一个文件流转换为一串字母或数字,当文件流发生变化时,得到的校验和也会不同. 通常用来判断一个文件是否有修改及远距离传输时判断文件的完整性. eg:Java ...

  5. java pass can not be_java – 校验和失败:Kerberos / Spring / Active Directory(2008)

    问题似乎在关键表中.有一些动作序列导致某些特定的keytab文件状态: (A)keytab适用于Java但不适用于k5start / kinit; (B)keytab不适用于Java,但适用于k5st ...

  6. Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  7. java putnextentry_Java对zip格式压缩和解压缩

    Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  8. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  9. 使用GZIP和Zip压缩Java数据流

    转载自   使用GZIP和Zip压缩Java数据流 本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java ...

最新文章

  1. C++格式化输入输出
  2. VeriSign SSL证书apache安装
  3. apache 开启Gzip网页压缩
  4. 安卓进阶系列-02搜索框(PersistentSearch)的使用
  5. mysql计算订单总金额_mysql统计当天消费总额
  6. java创建线程的两种方法是_java创建线程的两种方法
  7. html 安卓解锁,【华为手机解账户锁教程】手撕篇3 完美解锁华为EMUI8.0,8.1,8.2系统...
  8. QTableView效率优化3 - 自定义Model的内容补充
  9. 目前计算机新技术应用领域,计算机的应用领域分为哪六个方面
  10. java 防重复提交_Java中如何避免重复提交请求
  11. rmats2sashimiplot:可视化rmats的可变剪切结果
  12. asp/php/asp.net网站后台HTML编辑器eWebEditor升级kindeditor编辑器
  13. 在Storyboard中设置borderColor
  14. [Codeforces 274E]:Mirror Room(模拟)
  15. Python之RFM建模分析
  16. Ural 2045 Richness of words
  17. oracle转换成字符型,Oracle中将Clob字段转换成字符串
  18. 计算机桌面进入安全模式,win7安全模式无法入桌面怎么办?无法进入桌面解法...
  19. 自然语言生成技术现状调查:核心任务、应用和评估(2)
  20. 2017去哪儿网前端面试心得

热门文章

  1. 层次选择器(父子、后代、兄弟、相邻)
  2. [Beego]三、Filter 过滤器
  3. AG6201 (HDMI 转 VGA)内置MCU音频DAC
  4. python获取文件换行符_python – 读取文件没有换行符
  5. cad在线转换_手绘线稿转CAD,能一键生成为什么要描?
  6. 水晶报表如何完美导出一个Excel表格
  7. python逻辑运算符优先级
  8. 思维导图学习---计算机相关基础思维导图(1)
  9. esp-01s+1.3oled显示汉字星期、农历
  10. linux命令面试题