似乎无法弄清楚我在哪里出错:
private static String generateHashFromFile(String filePath) {
try {
final int BUFSZ = 32768;
MessageDigest sha = MessageDigest.getInstance("SHA-256");
FileInputStream in = new FileInputStream(filePath);
BufferedInputStream is = new BufferedInputStream(in, BUFSZ);
byte[] buffer = new byte[BUFSZ];
int num = -1;
while((num = is.read(buffer)) != -1) {
sha.update(buffer, 0, num);
}
is.close();
byte[] hash = sha.digest();
return byteArrayToHex(hash);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private static String byteArrayToHex(byte[] barray)
{
char[] c = new char[barray.length * 2];
byte b;
for (int i = 0; i < barray.length; ++i)
{
b = ((byte)(barray[i] >> 4));
c[i * 2] = (char)(b > 9 ? b + 0x37 : b + 0x30);
b = ((byte)(barray[i] & 0xF));
c[i * 2 + 1] = (char)(b > 9 ? b + 0x37 : b + 0x30);
}
return new String(c);
}
我得到的字符串如下:
")469.76F5941+31E25)6,9,C26)978)4*917180A4C(B7C,E,D+6,7133C705167"
显然不是十六进制!
问题:
答案 0 :(得分:1)
您的哈希生成和十六进制编码代码都有效。我会仔细看看你正在阅读的文件的内容。
你也可以这样编写十六进制编码方法:
public static String byteArrayToHex(byte[] barray) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < barray.length; i++) {
String hex = Integer.toHexString(0xff & barray[i]);
if (hex.length() == 1) sb.append('0');
sb.append(hex);
}
return sb.toString();
}
答案 1 :(得分:1)
您的哈希生成代码是正确的。要将byte[] barray
转换为十六进制字符串,您只需执行以下操作:
String c = new String();
for(short i = 0; i < barray.length; i++) {
c += Integer.toString((barray[i] & 255) + 256, 16).substring(1).toUpperCase();
}
答案 2 :(得分:0)
byte
值已签名,您正在使用已签名保留的右移。在计算高阶nybble时,这将导致b
的负值。
例如,考虑代码使用byte
值-112(0x90)执行的操作。右移时,它首先被提升为int
值0xFFFFFF90。然后它向右移4位,保留符号,并变为0xFFFFFFF9。然后将其转换回一个字节,该字节简单地丢弃高位24位,并将0xF9(-7十进制)分配给b
。 b
不大于9,因此生成的字符为(-7 + 48)或')'。
请改为:
int hi = (barray[i] & 0xF0) >>> 4, lo = barray[i] & 0xF;
使用byte
作为本地变量对32位或64位计算机没有任何好处。实际上,对byte
的强制转换是一种浪费的指令。