gpt4 book ai didi

java - 向十六进制添加填充的目的是什么?

转载 作者:行者123 更新时间:2023-11-30 08:20:48 25 4
gpt4 key购买 nike

嗨,我读了this post关于如何对密码实现加盐和哈希处理,我被困在上面指定的网站下面的指定代码上。

private static String toHex(byte[] array)
{
BigInteger bi = new BigInteger(1, array);
String hex = bi.toString(16);
int paddingLength = (array.length * 2) - hex.length();
if(paddingLength > 0)
return String.format("%0" + paddingLength + "d", 0) + hex;
else
return hex;
}

我的问题是,如果结果 paddingLength 大于零,他们为什么要计算 paddingLength 并将其实现为十六进制?

最佳答案

BigInteger(byte[]) 将字节数组解释为二进制补码值;这意味着对于 N 长度的数组,它有 2^(8*N) 个可能的值(因为每个字节包含 8 位)。

同时,一个长度为 M 的十六进制字符串有 16^M 个可能的值(因为每个字符编码 16 个值之一)。

作者想要在 byte[]String 之间建立一对一的映射:给定一个 String,你应该能够准确地确定 >byte[] 它来自。为此,我们必须确保字符串可以编码与 byte[] 一样多的值。代入上面的数字,我们得到:

(# values for an N-length byte[]) == (# values for an M-length String)
2^(8*N) == 16^M

让我们根据 N 求解 M。第一步是重写右侧。如果你还记得你的 exponent power rules , a^(b*c) == (a^b)^c。让我们将右边指数的底数设为 2:

                                  == (2^4)^M
== 2^(4*M)

所以我们有 2^(8*N) == 2^(4*M)。如果 2^k == 2^j,则表示 k == j。所以,8*N == 4*M。两边除以 4 得到 M = 2N。

为了将它们联系起来,请记住 N 是字节数组的长度,而 M 是十六进制字符串的长度。我们刚刚发现,如果存在一对一映射,M = 2N —— 换句话说,十六进制字符串的长度应该是字节数组的两倍。

填充确保这一点。

关于java - 向十六进制添加填充的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25697151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com