在此页面上:
http://www.shutterfly.com/documentation/OflyCallSignature.sfly
它说,一旦你生成一个哈希,那么:
将哈希转换为十六进制字符串
csharp中是否有代码执行此操作?
答案 0 :(得分:13)
要获取哈希值,请使用System.Security.Cryptography.SHA1Managed
class。
编辑:像这样:
byte[] hashBytes = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(str));
要将哈希值转换为十六进制字符串,请使用以下代码:
BitConverter.ToString(hashBytes).Replace("-", "");
如果您想要更快的实施,请使用以下功能:
private static char ToHexDigit(int i) {
if (i < 10)
return (char)(i + '0');
return (char)(i - 10 + 'A');
}
public static string ToHexString(byte[] bytes) {
var chars = new char[bytes.Length * 2 + 2];
chars[0] = '0';
chars[1] = 'x';
for (int i = 0; i < bytes.Length; i++) {
chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);
}
return new string(chars);
}
答案 1 :(得分:1)
我还没有发表评论,没有足够的代表,但是Lior正在将Java与C#混合在一个非常错误的答案中。
字节是无符号字节,与C#中所有其他整数类型完全相反,默认情况下会对其进行签名。
0xFF部分完全没有意义,因为即使字节被签名,例如0xFE也是-2。例如,使用按位和0xFE和0xFF不会阻止负数0xFE成为结果。 0x7F会。
关于最佳答案,我非常确定这些微优化可能有所帮助,尽管它们可能不会产生任何真正差异的微优化,因为JIT编译器可能只是做其他事情因为计算机太快了。
chars[2 * i + 2] = ToHexDigit(bytes[i] / 16);
chars[2 * i + 3] = ToHexDigit(bytes[i] % 16);
使用bitshift和bitwise ops代替分频器和模数的小改动。
chars[2 * i + 2] = ToHexDigit((bytes[i] >> 4) & 0xF);
chars[2 * i + 3] = ToHexDigit(bytes[i] & 0xF);
这是另一个&#34;优化&#34;,虽然我认为它更具可读性。也许这是因为我很清楚大部分的ASCII表格。
private static char ToHexDigit(int i)
{
return (char)(i + (i < 10 ? 48 : 55));
}
如果您正在尝试实现小写十六进制(没有ToLower),只需将87与87交换。这非常简单。
更新:看起来像Lior或有人删除了他的答案。这是一个很好的举动。