Я хотел бы знать, как отменить процесс 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 для файла. Приведенный выше метод является примером понимания того, как работает декодирование для получения правильной строки.
ЗАКОДИРОВАНО
/КУГОуоЭСМВЮДб+БТМК1ЛаГе7к=
ДЕКОДИРОВАНО
FCA5063AEA0448C598B836FE05330AD4B6867BB9
or
0xFCA5063AEA0448C598B836FE05330AD4B6867BB9
Обновлено, чтобы отразить правильное значение SHA1 благодаря Porges и исправлению шестнадцатеричной ошибки, обнаруженной Дином 'codeka' Хардином.
Реализованное решение
Вот реализация, которая у меня есть сейчас, она из поста 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")));
}