JAVA IO - 生成文件的checksum值

import java.io.FileInputStream;
import java.security.MessageDigest;

public class CheckSumGenerator {
	public static void main(String args[]) throws Exception {
		String datafile = "C:\\work\\hello\\helloworld.txt";

		MessageDigest md = MessageDigest.getInstance("MD5");
		FileInputStream fis = new FileInputStream(datafile);
		byte[] dataBytes = new byte[1024];

		int nread = 0;

		while ((nread = fis.read(dataBytes)) != -1) {
			md.update(dataBytes, 0, nread);
		}
		;

		byte[] mdbytes = md.digest();

		// convert the byte to hex format
		StringBuffer sb = new StringBuffer("");
		for (int i = 0; i < mdbytes.length; i++) {
			sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16)
					.substring(1));
		}

		System.out.println("Digest(in hex format):: " + sb.toString());

	}
}



转载于:https://my.oschina.net/u/138995/blog/192062

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码的作用是计算以太网帧中的IP包头部校验和,并返回计算结果。具体来说,该函数实现了以下功能: 1. 将IP头部按照2字节进行累加,并将结果存储在cksum变量中; 2. 如果累加的结果超过2字节,则将高16位与低16位相加,直到结果小于2字节; 3. 将累加结果按位取反,得到校验和的得注意的是,该函数只计算IP头部的校验和,如果要计算整个IP数据报的校验和,需要在IP头部中设置校验和字段为0,然后对整个IP数据报进行累加和计算,并将计算结果填充到校验和字段中。 具体代码注释如下: ``` #include "../network_protocol.h" /* 计算以太网帧中的IP包首部检验,以本地节顺序返回 */ uint16 ipcksum(byte *eth) { uint16 *hptr; // 用于2字节指针转换 int32 i; // 用于循环计数 uint16 word; // 用于2字节的取舍 uint32 cksum=0; // 用于2字节的累加,辅助计算校验 hptr = (uint16 *) ((struct EthPkt*)eth)->data; // 获取IP头部指针 /* 对首部按2字节进行累加 */ cksum = 0; for (i = 0; i < 10; i++) { // 循环10次,每次累加2字节 word = *hptr++; // 获取2字节的 cksum += word; // 将2字节的累加到cksum中 if (cksum & 0xffff0000) { // 如果累加的结果超过2字节,则将高16位与低16位相加 cksum = (cksum & 0xffff) + (cksum >> 16); } } cksum = (cksum & 0xffff) + (cksum >> 16); // 将cksum的高16位与低16位相加 cksum = (cksum & 0xffff) + (cksum >> 16); // 将cksum的高16位与低16位相加 cksum = ~cksum; // 将累加结果按位取反,得到校验和的 return (uint16)cksum; // 将校验和的以本地字节序返回 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值