/**
* 检查输入流的MD5值是否符合.如果MD5为null则直接返回此流.
*
* @param md5
* 验证码
* @param is
* 源输入流
* @return 处理后的输入流,和源输入流可能不为一个对象
*/
private InputStream checkMD5(String md5, InputStream is) {
if (md5 == null) {
return is;
}
// 重写一个流,防止传入的流不能reset
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
int len = -1;
byte[] b = new byte[1024 * 5];
while ((len = is.read(b)) != -1) {
if (md != null) {
md.update(b, 0, len);
}
baos.write(b, 0, len);
}
if (!md5.equalsIgnoreCase(digestMD5(md.digest()))) {
if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(
getUiManager().getRootPanel(),
"数据校验发现和传入值不匹配,系统将无法解析该文件,是否重新读取文件?")) {
actionPerformed(null);
} else {
return null;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return new ByteArrayInputStream(baos.toByteArray());
}
/**
* 由128位的字节结果转换成32位字符串
*
* @param digest
* MD5 的计算结果是一个 128位的长整数,
* @return
*/
private String digestMD5(byte digest[]) {
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
// 用字节表示就是 16 个字节
char[] result = new char[16 * 2]; // 每个字节用 16
// 进制表示的话,使用两个字符,
// 所以表示成 16 进制需要 32 个字符
int j = 0; // 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5
// 的每一个字节
// 转换成 16 进制字符的转换
byte b = digest[i]; // 取第 i 个字节
result[j++] = hexDigits[b >>> 4 & 0xf];
// 取字节中高4位的数字转换,
// >>> 为逻辑右移,将符号位一起右移
result[j++] = hexDigits[b & 0xf];
// 取字节中低 4位的数字转换
}
return new String(result);
}
分享到:
相关推荐
在JavaScript的世界里,Node.js提供了一个强大的加密模块`crypto`,用于执行各种加密和解密操作,包括MD5(Message-Digest Algorithm 5)哈希计算。MD5是一种广泛使用的散列函数,它能将任意长度的数据转化为固定...
【自用】Tools.cpp 是一个个人使用的C++源代码文件,通常包含了一些特定于开发者或者项目需要的工具函数或类。这些工具可能涉及到各种编程任务,如数据处理、文件操作、算法实现等。从提供的文件名来看,我们可以...
4. **hash校检计算工具**:用于计算文件或字符串的哈希值,如MD5、SHA1、SHA256等。这需要理解各种哈希算法的原理,并能够用C++编写实现这些算法的代码。 5. **进制转换工具**:可以将数字从一种进制转换为另一种,...
此外,代码中定义了一些辅助变量,如JD、VD、CD、MD和BD,用于统计多个周期内各项指标达到低点的情况,当它们的和大于等于6且VARC时,触发“抄底”信号,表示强烈买入机会。 最后,“鞋底”和“问”这两个变量通过...
它可能会使用哈希算法(如MD5或SHA-1)对文件进行快速校验,以确定它们是否完全相同。找到重复文件后,用户可以选择性地删除其中的副本,保留一个原始文件,以释放硬盘空间。 **空文件查找**: 空文件是指没有数据...
【自用】应用基础 2022-3-3 的学习资料包含了多个主题,涵盖了计算机科学和技术领域的关键基础知识。这些资源旨在帮助个人提升在Linux操作系统、编程语言(如Java和Python)、数据库管理(通过SQL)、数学建模、软件...
- `md <directory>`:创建新目录。 - `del <file>`:删除文件。 - `ipconfig`:显示IP配置信息。 - `dir`:列出当前目录下的文件和子目录。 通过以上总结,我们可以看到Java作为一门面向对象的语言,在开发过程...
解压后,开发者通常会找到如`.cpp`、`.java`、`.py`等不同编程语言的源文件,以及`.txt`或`.md`格式的readme文件,readme文件通常会提供关于如何构建、运行和使用该项目的说明。 学习源码的过程可以分为几个步骤: ...
MD5 取数据摘要.EC MDB到超级列表框.ec mhs.ec misc1.ec mmqrOICQ.ec mp3信息模 块.ec MTH文件编码模块.ec Mx.Shuai模块.ec ns.ec NT系统服务.ec OCX控件高级注 册.ec ODBC方式填充树型框.ec ontop.ec PGBEAPICopy....
MD5 取数据摘要.EC MDB到超级列表框.ec mhs.ec misc1.ec mmqrOICQ.ec mp3信息模 块.ec MTH文件编码模块.ec Mx.Shuai模块.ec ns.ec NT系统服务.ec OCX控件高级注 册.ec ODBC方式填充树型框.ec ontop.ec PGBEAPICopy....
MD5取数据摘要.EC MDB到超级列表框.ec mmqrOICQ.ec mp3信息模块.ec NT系统服务.ec OCX控件高级注册.ec ODBC方式填充树型框.ec PGBEAPICopy.ec powerdll.ec ProcessInfo.ec ProgressBar.ec qp编解码.ec ...