我对以下代码中的内容并不了解。为什么长度设置为16? ret
变量的目的是什么?
请解释。
我不明白这一点:
foreach (byte a in hash)
{
if (a < 16)
ret += "0" + a.ToString("x");
else
ret += a.ToString("x");
}
答案 0 :(得分:6)
此
if (a < 16)
ret += "0" + a.ToString("x");
else
ret += a.ToString("x");
是一种更糟糕的写作方式
ret += a.ToString("x2");
它的目的是生成一个长度恰好为2的字符串,它是数字a
的十六进制形式。由于十六进制只有一位数就可以达到15,因此代码显示“如果它适合一位数,则手动在前面加零”。
答案 1 :(得分:6)
此代码将十六进制的哈希码作为字符串获取,每个字节表示为一个2位十六进制值 - 您可以将其缩短为:
foreach (byte b in hashValue)
ret +=b.ToString("X2");
或更好地使用StringBuilder
代替:
StringBuilder strHash = new StringBuilder();
foreach (byte b in hashValue)
strHash.Append(b.ToString("X2"));
ret = strHash.ToString();
或使用Linq更优雅(但引入一些开销):
ret = string.Join("",hashValue.Select(b => b.ToString("X2")));
答案 2 :(得分:4)
只是将结果作为十六进制值返回。如果a> = 16,那么十六进制值将是两个字符长(例如:A0)。如果a&lt; 16,十六进制值将是一个字符长(例如:A),所以用额外的0(=&gt; 0A)填充。
答案 3 :(得分:3)
十六进制是16的基数,因此0123456789
代替0123456789ABCDEF
作为可用数字而不是{{1}}。十六进制输出中的每个字节由2位数(16×16 = 256)表示以避免歧义,因此&lt; 16检查确保ToString将输出正确数量的字符。
答案 4 :(得分:1)
它将字节值转换为其十六进制值的2个字符的字符串表示形式。对于值&lt; 16它会输出一个字符。这不是一个非常干净的方式,因此混乱。
答案 5 :(得分:1)
ret
是函数中的ret
值。