我想从文件中的特定字节创建md5校验和。 校验和将来自文件的100个字节。
我写这段代码:
public static String getMD5ChecksumByFlash(String filename) throws Exception {
InputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[1];
MessageDigest complete = MessageDigest.getInstance("MD5");
int passes = fis.available() / 100;
int currentOffset = 0;
int readBytes = -1;
do {
System.out.println("0a "+currentOffset);
System.out.println("0b "+readBytes);
readBytes = fis.read(buffer, currentOffset, 1);
System.out.println("1 "+currentOffset);
System.out.println("2 "+readBytes);
if ( readBytes!=-1 ) {
complete.update(buffer, 0, readBytes);
currentOffset += passes;
System.out.println("4 "+readBytes);
}
System.out.println("3 "+currentOffset);
System.out.println("5 "+readBytes);
} while ( readBytes!=-1 );
fis.close();
byte[] b = complete.digest();
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}
但它不起作用:/ 它返回:
0a 0
0b -1
1 0
2 1
4 1
3 93928
5 1
0a 93928
0b 1
null
怎么了?
PS。 这个文件不是1byte文件 - 它是pidgin-2.10.1.exe
答案 0 :(得分:1)
在评论中做了一些澄清之后,看起来传递给read
函数的偏移量指定了数组中的偏移量,而不是文件。这就是你在那里获得null
并抛出异常的原因。因此,您可以使用以下代码替换read
调用来更正代码:
readBytes = fis.read(buffer, 0, 1);
fis.skip(passes - 1);
稍微不同,更完整的方法是:
public static String getMD5ChecksumByFlash(String filename) throws Exception {
InputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[100];
MessageDigest complete = MessageDigest.getInstance("MD5");
int passes = fis.available() / 100;
int currentOffset = 0;
int readBytes = 0;
for (int i = 0; i < 100; i++) {
readBytes += fis.read(buffer, i, 1);
// TODO: Check for I/O errors
fis.skip(passes - 1);
}
fis.close();
complete.update(buffer, 0, readBytes);
byte[] b = complete.digest();
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}
答案 1 :(得分:1)
好的只是一个简单的方法,没有所有的错误检查,循环和大小检查,你需要一个可靠的解决方案。这会将每100字节1个字节读入bytebuffer。
byte[] arr = new byte[100];
for (int i = 0; i < arr.length; i++) {
is.read(arr, i, 1);
is.skip(99);
}