J'aimerais savoir comment inverser le processus du DecodeBinaryBase64 ci-dessous afin d'avoir une méthode Encode correspondante. En bref, un code C# qui, si on lui donne la sortie de cette méthode, renverrait la même chaîne que celle qu'il a prise en entrée.
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();
}
Voici un exemple de chaîne codée et de son équivalent décodé. Le résultat est un hachage SHA1 pour un fichier. La méthode ci-dessus permet de comprendre comment le décodage fonctionne pour obtenir la bonne chaîne.
ENCODED
/KUGOuoESMWYuDb+BTMK1LaGe7k=
DECODED
FCA5063AEA0448C598B836FE05330AD4B6867BB9
ou
0xFCA5063AEA0448C598B836FE05330AD4B6867BB9
Mise à jour pour refléter la valeur SHA1 correcte grâce à Porges et un correctif pour un bug hexagonal trouvé par Dean 'codeka' Hardin.
Solution mise en œuvre
Voici l'implémentation que j'ai maintenant, elle est tirée de l'article de Porges distillé en deux méthodes.
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")));
}