我想知道如何反转下面的 DecodeBinaryBase64 的过程,以便我可以有一个匹配的 Encode 方法。简而言之,如果给定此方法的输出,则 C# 代码将返回与输入相同的字符串。
private static string DecodeBinaryBase64(string stringToDecode)
{
StringBuilder builder = new StringBuilder();
foreach (var b in Convert.FromBase64String(stringToDecode))
builder.Append(string.Format("{0:X2}", b));
return builder.ToString();
}
这是编码字符串及其解码对应物的示例。结果是文件的 SHA1 哈希。上述方法是了解解码如何工作以获取正确字符串的示例。
编码
/KUGOuoESMWYuDb+BTMK1LaGe7k=
解码
FCA5063AEA0448C598B836FE05330AD4B6867BB9
或者
0xFCA5063AEA0448C598B836FE05330AD4B6867BB9
由于 Porges 和 Dean 'codeka' Hardin 发现的十六进制错误修复,更新以反映正确的 SHA1 值。
已实施的解决方案
这是我现在拥有的实现,它是从 Porges 帖子中提炼成两种方法的。
private static string EncodeFileDigestBase64(string digest)
{
byte[] result = new byte[digest.Length / 2];
for (int i = 0; i < digest.Length; i += 2)
result[i / 2] = byte.Parse(digest.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
if (result.Length != 20)
throw new ArgumentException("Not a valid SHA1 filedigest.");
return Convert.ToBase64String(result);
}
private static string DecodeFileDigestBase64(string encodedDigest)
{
byte[] base64bytes = Convert.FromBase64String(encodedDigest);
return string.Join(string.Empty, base64bytes.Select(x => x.ToString("X2")));
}