BigInteger.toString方法删除前导0(BigInteger.toString met

2019-06-23 20:50发布

我试图使用生成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领先被删除?

Answer 1:

我会亲自避免使用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);
}


Answer 2:

的String.format( “%064X”,新的BigInteger(1,hmac.doFinal(message.getBytes())));

哪里

  1. 0 - 零领先标志
  2. 64 - 串长度
  3. X - 大写


Answer 3:

它删除,因为前导零并不显著,根据BigInteger 。 有没有什么区别27000000000027

如果你想有一个特定的长度,你必须强迫自己吧,喜欢的东西:

output = ("00000000000000000000000000000000"+output).substring(output.length());

(缺憾尽管这是)。



Answer 4:

被删除的零点使用此代码替换:

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;
    }

根据需要循环将占尽可能多的前导零



Answer 5:

MessageDigest m=MessageDigest.getInstance("MD5");
m.update(PlainText.getBytes(),0,PlainText.length());
String M1=new BigInteger(1,m.digest()).toString(16);      
return M1;


文章来源: BigInteger.toString method is deleting leading 0