我试图使用生成MD5消息摘要总和。 ,我有下面的代码。
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
这不是返回32字符串,但一个31字符串8611c0b0832bce5a19ceee626a403a7
期望的字符串是08611c0b0832bce5a19ceee626a403a7
0领先中缺少输出。
我尝试其他方法
byte[] md5sum = digest.digest();
output = new String(Hex.encodeHex(md5sum));
而输出为预期。
我检查了doc和Integer.toString不按它的转换
由Character.forDigit提供的数字到字符的映射被使用,并且如果合适的话减号被前置。
在Character.forDigit methos
数字参数是有效的,如果0 <=数字<基数。
可有一个人告诉我,这两种方法如何不同,为什么0领先被删除?
我会亲自避免使用BigInteger
二进制数据转换为文本。 这算不上什么它的存在,即使它可用于这一点。 有可用的转换的代码加载byte[]
它的十六进制表示-例如使用Apache的百科全书编解码器或简单的一个方法:
private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
public static String toHex(byte[] data) {
char[] chars = new char[data.length * 2];
for (int i = 0; i < data.length; i++) {
chars[i * 2] = HEX_DIGITS[(data[i] >> 4) & 0xf];
chars[i * 2 + 1] = HEX_DIGITS[data[i] & 0xf];
}
return new String(chars);
}
的String.format( “%064X”,新的BigInteger(1,hmac.doFinal(message.getBytes())));
哪里
- 0 - 零领先标志
- 64 - 串长度
- X - 大写
它删除,因为前导零并不显著,根据BigInteger
。 有没有什么区别27
和000000000027
。
如果你想有一个特定的长度,你必须强迫自己吧,喜欢的东西:
output = ("00000000000000000000000000000000"+output).substring(output.length());
(缺憾尽管这是)。
被删除的零点使用此代码替换:
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.reset();
digest.update(output.getBytes());
byte[] outDigest = digest.digest();
BigInteger outBigInt = new BigInteger(1,outDigest);
output = outBigInt.toString(16);
while (output.length() < 32){
output = "0"+output;
}
根据需要循环将占尽可能多的前导零
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(PlainText.getBytes(),0,PlainText.length());
String M1=new BigInteger(1,m.digest()).toString(16);
return M1;