0

Delphi にある deencrypt 関数を C# に移植しようとしています。Delphi では、関数 Move を使用してポインターを使用してメモリにデータを取得するため、marshal.copy 関数を使用して同じ結果を得ようとしましたが、アクセス違反例外が発生したり、空白スペースが発生したりすることがあります。関数のコードを添付したままにします。何か案は?どうもありがとう!

    public string prDecode(string s)
    {
        byte[] ArrayMap = new byte[256] {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
                                         0, 0, 0, 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59,60,
                                         61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,  3, 4, 5, 6, 7, 8, 9, 10, 
                                         11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 
                                         0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 
                                         36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
                                         51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
        int I;
        char[] ArrayS = s.ToCharArray(0, s.Length);
        string resultado = "";
        char[] ArrayR = resultado.ToCharArray(0, resultado.Length);
        switch (s.Length)
        {
            case 2: 
                I = ArrayMap[ArrayS[0]] + (ArrayMap[ArrayS[1]] << 6);
                ArrayR = new char[1];
                Marshal.Copy((IntPtr)I, ArrayR, 0, ArrayR.Length);

                break;
            case 3:
                I = ArrayMap[ArrayS[0]] + (ArrayMap[ArrayS[1]] << 6) + 
                    (ArrayMap[ArrayS[2]] << 12);
                ArrayR = new char[2];
                Marshal.Copy((IntPtr)I, ArrayR, 0, ArrayR.Length);
                break;

            case 4:
                I = ArrayMap[ArrayS[0]] + (ArrayMap[ArrayS[1]] << 6) + 
                    (ArrayMap[ArrayS[2]] << 12) + (ArrayMap[ArrayS[3]] << 18);
                ArrayR = new char[3];
                Marshal.Copy((IntPtr)I, ArrayR, 0, ArrayR.Length);
                break;
        }
        string clave = new string (ArrayR);
        return clave;

    }
4

2 に答える 2

2

あなたが探している関数は、Marshal.Copy ではなく、Array.CopyまたはBuffer.BlockCopyだと思います。Marshal.Copy は、アンマネージ メモリとの間でデータをコピーするためのものです。

于 2012-08-23T14:21:10.810 に答える
1

レガシ コードのアンマネージ メモリにアクセスしない限り、Marshal を使用する必要はありません。マネージ コードはポインターを必要とせず、マネージ メソッドを使用するとはるかに高速になります。

あなたが探しているのは、マネージド コードを使用して配列間でコピーする Array.Copy だと思います。

于 2012-08-23T14:20:26.777 に答える