C# 谢谢你以一种可以理解和对抗的方式向我解释我的错误。@CG:这比你原来的哈希短了一个字符。。。所以它仍然缺少一些字节:)@Porges我注意到了,但我错过了编辑评论的窗口,我用正确的SHA1更新了原始问题(我希望;)@Isaac:编辑之前的示例来自CG的原始

C# 谢谢你以一种可以理解和对抗的方式向我解释我的错误。@CG:这比你原来的哈希短了一个字符。。。所以它仍然缺少一些字节:)@Porges我注意到了,但我错过了编辑评论的窗口,我用正确的SHA1更新了原始问题(我希望;)@Isaac:编辑之前的示例来自CG的原始,c#,encoding,.net-4.0,decoding,C#,Encoding,.net 4.0,Decoding,谢谢你以一种可以理解和对抗的方式向我解释我的错误。@CG:这比你原来的哈希短了一个字符。。。所以它仍然缺少一些字节:)@Porges我注意到了,但我错过了编辑评论的窗口,我用正确的SHA1更新了原始问题(我希望;)@Isaac:编辑之前的示例来自CG的原始哈希,它缺少一些数字:)@Porges这是一个使用linq的更好的实现,今天早上我改用了这个。 private static string DecodeBinaryBase64(string stringToDecode) { Stri


谢谢你以一种可以理解和对抗的方式向我解释我的错误。@CG:这比你原来的哈希短了一个字符。。。所以它仍然缺少一些字节:)@Porges我注意到了,但我错过了编辑评论的窗口,我用正确的SHA1更新了原始问题(我希望;)@Isaac:编辑之前的示例来自CG的原始哈希,它缺少一些数字:)@Porges这是一个使用linq的更好的实现,今天早上我改用了这个。
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();
}
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")));
}  
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 "0x" + builder.ToString();
}

private static string EncodeBinaryBase64(string stringToEncode)
{
    var binary = new List<byte>();
    for(int i = 2; i < stringToEncode.Length; i += 2)
    {
        string s = new string(new [] {stringToEncode[i], stringToEncode[i+1]});
        binary.Add(byte.Parse(s, NumberStyles.HexNumber));
    }
    return Convert.ToBase64String(binary.ToArray());
}
/** Here are the methods in question: **/
string Encode(string input)
{
    return SHA1ToBase64String(StringToBytes(input));
}

string Decode(string input)
{
    return BytesToString(Base64StringToSHA1(input));
}
/****/

string BytesToString(byte[] bytes)
{
    return string.Join("",bytes.Select(x => x.ToString("X2")));
}

byte[] StringToBytes(string input)
{
    var result = new byte[input.Length/2];

    for (var i = 0; i < input.Length; i+=2)
        result[i/2] = byte.Parse(input.Substring(i,2), System.Globalization.NumberStyles.HexNumber);

    return result;
}

string SHA1ToBase64String(byte[] hash)
{
    if (hash.Length != 20)
        throw new Exception("Not an SHA-1 hash.");

    return Convert.ToBase64String(hash);
}

byte[] Base64StringToSHA1(string input)
{
    return Convert.FromBase64String(input);
}

void Main() {

    var encoded = "/KUGOuoESMWYuDb+BTMK1LaGe7k=";

    var decoded = Decode(encoded);
    var reencoded = Encode(decoded);

    Console.WriteLine(encoded == reencoded); //True
    Console.WriteLine(decoded);
    // FCA5063AEA0448C598B836FE05330AD4B6867BB9
}
f(Decode(x)) == x // "left inverse"
Decode(f(x)) == x // "right inverse"