要求:1)以命令行形式运行:check_sum infile
其中check_sum为程序名,infile为输入数据文陆颤件名。
2)输出:数据文件的效验和
附:效验和(checksum)
原理:把要带悉乎发送的数据看成二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。
为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中蠢悉。
import java.security.MessageDigest
public class MD5HashingExample
{
public static void main(String[] args)throws Exception
{
String password = "123456"
MessageDigest md = MessageDigest.getInstance("MD5")
md.update(password.getBytes("UTF-8" )) //or GBK
byte byteData[] = md.digest()
//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer()
渣卖蔽 for (int i = 0 i < byteData.length i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))
}
System.out.println("Digest(in hex format):: " + sb.toString())
//convert the byte to hex format method 2
配碧 StringBuffer hexString = new StringBuffer()
for (int i=0i<byteData.lengthi++) {
String hex=Integer.toHexString(0xff & byteData[i])
if(hex.length()==1) hexString.append('0')
hexString.append(hex)
}
System.out.println("Digest(in hex format):: " 如州+ hexString.toString())
}
}
实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最空唯准确的。同时也是效率最低的。应用例子:龙珠cpu在线调试工具bbug.exe。它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。 实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。
应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。
bcc异或校验法(block check character)
实现方法:很多迅者基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。
校验值计算的代码类似于:
unsigned uCRC=0//校验初始值
for(int i=0i<DataLenthi++) uCRC^=Data[i]
适用范围:适用于大多数要求不高的数据通讯。
应用例子:ic卡接口通讯、很多单片机系统斗昌培的串口通讯都使用。 (Cyclic Redundancy Check)
实现方法:这是利用除法及余数的原理来进行错误检测的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)