关于XXTEA,我可以使用加密,但是没办法解密。

我使用加密函数加密内容,但是调用解密函数来解密内容的时候,就会报错误。SystermIndexOutofRangeException:"Index was outside thebounds of the array."并且定位到最后一个地方Result[i] = (byte)(Data[i >> 2] >> ((i & 3) << 3));。
这个我都是从网上抄的,没有丝毫错误,而且我对照了不同的版本,都是一样的代码。我研究了很久,认为可能应该是最后一个i的问题,i>>2会产生非整数,定位不到。但是我加密的时候函数也调用了最后这一个代码,他却成功了,所以又开始怀疑了。XXTEA所有代码放在下面了,网上抄的普遍版本,应该不会错。

public class XXTea
{
    public static byte[] Encrypt(byte[] Data, byte[] Key)
    {
        if (Data.Length == 0)
        {
            return Data;
        }
 
        return ToByteArray(Encrypt(TouintArray(Data, true), TouintArray(Key, false)), false);
    }
 
    public static byte[] Decrypt(byte[] Data, byte[] Key)
    {
        if (Data.Length == 0)
        {
            return Data;
        }
        return ToByteArray(Decrypt(TouintArray(Data, false), TouintArray(Key, false)), true);
    }
 
    private static uint[] Encrypt(uint[] v, uint[] k)
    {
        int n = v.Length - 1;
        if (n < 1)
        {
            return v;
        }
        if (k.Length < 4)
        {
            uint[] Key = new uint[4];
            k.CopyTo(Key, 0);
            k = Key;
        }
        uint z = v[n], y = v[0], delta = 0x9E3779B9, sum = 0, e;
        int p, q = 6 + 52 / (n + 1);
        while (q-- > 0)
        {
            sum = unchecked(sum + delta);
            e = sum >> 2 & 3;
            for (p = 0; p < n; p++)
            {
                y = v[p + 1];
                z = unchecked(v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
            }
            y = v[0];
            z = unchecked(v[n] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
        }
        return v;
    }
 
    private static uint[] Decrypt(uint[] v, uint[] k)
    {
        int n = v.Length - 1;
        if (n < 1)
        {
            return v;
        }
        if (k.Length < 4)
        {
            uint[] Key = new uint[4];
            k.CopyTo(Key, 0);
            k = Key;
        }
        uint z = v[n], y = v[0], delta = 0x9E3779B9, sum, e;
        int p, q = 6 + 52 / (n + 1);
        sum = unchecked((uint)(q * delta));
        while (sum != 0)
        {
            e = sum >> 2 & 3;
            for (p = n; p > 0; p--)
            {
                z = v[p - 1];
                y = unchecked(v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
            }
            z = v[n];
            y = unchecked(v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
            sum = unchecked(sum - delta);
        }
        return v;
    }
 
    private static uint[] TouintArray(byte[] Data, bool IncludeLength)
    {
        int n = (((Data.Length & 3) == 0) ? (Data.Length >> 2) : ((Data.Length >> 2) + 1));
        uint[] Result;
        if (IncludeLength)
        {
            Result = new uint[n + 1];
            Result[n] = (uint)Data.Length;
        }
        else
        {
            Result = new uint[n];
        }
        n = Data.Length;
        for (int i = 0; i < n; i++)
        {
            Result[i >> 2] |= (uint)Data[i] << ((i & 3) << 3);
        }
        return Result;
    }
 
    private static byte[] ToByteArray(uint[] Data, bool IncludeLength)
    {
        int n;
        if (IncludeLength)
        {
            n = (int)Data[Data.Length - 1];
        }
        else
        {
            n = Data.Length << 2;
        }
        byte[] Result = new byte[n];
        for (int i = 0; i < n; i++)
        {
            Result[i] = (byte)(Data[i >> 2] >> ((i & 3) << 3));
        }
        return Result;
    }
}