如何解决字符串十六进制哈希到字节
我有十六进制形式的字符串 hash (“ e6fb06210fafc02fd7479ddbed2d042cc3a5155e”),我想将其与crypt.digest()进行比较。 一种可行的方法是将crypt.digest()转换为十六进制,但我想避免多次转换,而是将哈希从十六进制形式(上述)转换为字节数组。
我尝试过的是:
byte[] hashBytes = new BigInteger(hash,16).toByteArray();
,但与crypt.digest()不匹配。当我将hashBytes转换回十六进制时,得到“ 00 e6fb06210fafc02fd7479ddbed2d042cc3a5155e”。
前导零似乎是我无法匹配字节数组的原因。为什么会发生?如何使用crypt.digest()和toByteArray获得相同的结果?
解决方法
可以在following answer的一个有关高度相关问题Convert a string representation of a hex dump to a byte array using Java?的主题中找到答案:
BigInteger
的问题在于必须有一个“符号位” 。如果前导字节设置了高位,则结果字节数组在第一个位置具有额外0 。但仍然+1。– 2011年10月28日灰色,16:20
由于第一位具有特殊含义(表示符号,0表示正,1表示负),因此,如果您的数据以{开头,BigInteger
将在数据前附加一个0
{1}}在高位。否则,尽管开始时不是负数,但它会被解释为负数。
即数据
1
变成
101110
如果发生这种情况,您可以使用0101110
轻松地手动撤消。
但是,我建议不要使用该链接库中发布的其他解决方案之一,而不要修复该代码。它们更清洁,更易于阅读和维护。
,额外的00的原因是e6
设置了高(符号)位。
冗余字节00使其成为BigInteger的无符号值。
String hash = "e6fb06210fafc02fd7479ddbed2d042cc3a5155e";
byte[] hashBytes = new BigInteger(hash,16).toByteArray();
hashBytes = hashBytes.length > 1 && hashBytes[0] == 0
? Arrays.copyOfRange(hashBytes,1,hashBytes.length) : hashBytes;
System.out.println(Arrays.toString(hashBytes));
问题出现了,如果哈希实际上以00开头怎么办? 然后,您需要哈希长度,或者进行宽大的比较。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。