Hy guys!
我有以下问题: 我需要在Java中散列一个无符号字节,它在0-255之间(将是......)。 主要问题是java根本没有无符号字节类型。 我找到了一个解决方法,并使用int而不是byte进行了一些修改。
主要问题是:Java.securitys Messagedigest.digest函数只接受字节数组类型,但我需要给它一个int数组。
有人为此做了一个简单的解决方法吗? 我正在寻找第三方sha-1功能,但没有找到任何功能。也没有任何示例代码。
基本上我需要的是: 我有一个无符号字节值,例如:0xFF,需要得到以下sha1哈希值:85e53271e14006f0265921d02d4d736cdc580b0b
任何帮助将不胜感激。
答案 0 :(得分:2)
重要的是要理解有符号和无符号字节之间的表示没有区别。签名是关于如何通过算术运算处理字节(除了加法和减法,在2的补码表示的情况下)。
因此,如果您使用byte
进行数据存储,那么您只需要确保在将值转换为byte
时将它们视为无符号(使用显式转换为(byte)
},点1)和byte
s(使用& 0xff
阻止符号扩展,第2点):
public static void main(String[] args) throws Exception {
byte[] in = { (byte) 0xff }; // (1)
byte[] hash = MessageDigest.getInstance("SHA-1").digest(in);
System.out.println(toHexString(hash));
}
private static String toHexString(byte[] in) {
StringBuilder out = new StringBuilder(in.length * 2);
for (byte b: in)
out.append(String.format("%02X", b & 0xff)); // (2)
return out.toString();
}
答案 1 :(得分:1)
摘要不关心Java如何看待字节的符号;它只关心字节的位模式。试试这个:
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update((byte) 0xFF);
byte[] result = digest.digest();
StringBuilder buffer = new StringBuilder();
for (byte each : result)
buffer.append(String.format("%02x", 0xFF & each));
System.out.println(buffer.toString());
这应该打印85e53271e14006f0265921d02d4d736cdc580b0b
。
答案 2 :(得分:0)
查看Apache Commons Codec库,方法DigestUtils.sha(String data)。它可能对你有用。