有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BigInteger。toString方法正在删除前导0

我正在尝试使用MessageDigest生成MD5 sum。 我有以下代码

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

并且输出与预期一致

我检查了文档和整数。toString根据它进行转换

The digit-to-character mapping provided by Character.forDigit is used, and a minus sign is prepended if appropriate.

在性格上。福迪吉特法

The digit argument is valid if 0 <=digit < radix.

有人能告诉我这两种方法有什么不同吗?为什么删除前导0


共 (5) 个答案

  1. # 1 楼答案

    删除的零将使用以下代码替换:

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

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

  2. # 2 楼答案

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

    根据BigInteger,删除它是因为前导零不重要。在27000000000027之间没有区别

    如果你想要一个特定的长度,你必须自己强制,比如:

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

    (尽管这是一个拙劣的说法)

  4. # 4 楼答案

    String.format("%064X", new BigInteger(1, ByteArray);

    在哪里

    1. 0-零前导符号
    2. 64-字符串长度
    3. X-大写
    4. ByteArray-要在其上运行此操作的ByteArray
  5. # 5 楼答案

    我个人会避免使用BigInteger将二进制数据转换为文本。这并不是它的真正目的,即使它可以被用来做这件事。有大量代码可用于将byte[]转换为其十六进制表示形式,例如使用Apache Commons Codec或简单的单一方法:

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