Работа с указателями и битовые операции (с C++ в C#)

Узнай цену своей работы

Формулировка задачи:

Помогите перевести это в эффективный C# код
int UnknownFunc0001(signed int a1)
{
  return ((a1 >> 24) & 0xFF) + ((((a1 >> 16) & 0xFF) + ((((BYTE)a1 << 8) + ((a1 >> 8) & 0xFF)) << 8)) << 8);
}
int CryptPacket(DWORD* pBuffer, signed int a2, int iKey)
{
    int result = ((a2&0xFF00)|(a2&0xFC))/4;
    if (result > 0)
    {
        int v4 = 0;
        DWORD* v6 = pBuffer;
        int v7 = ~iKey;
        for (int i = ~iKey; ; v7 = i )
        {
            a2 = UnknownFunc0001(*v6 ^ v7);
            for(int v8 = 0; v8 < 4; v8 += 2)
            {
                *((char*)&a2+v8) = (v8 | ((BYTE)v8 << v8) | UnknownBytes[((BYTE)(v4-(DWORD)&a2) + (BYTE)&a2 + (BYTE)v8) & 0xF] | 0xA5) ^ *((BYTE *)&a2 + v8);
            }
            ++v4;
            *v6 = iKey ^ a2;
            v6++;
            if(v4 >= result)
                break;
        }
    }
    return result;
}

Решение задачи: «Работа с указателями и битовые операции (с C++ в C#)»

textual
Листинг программы
        public unsafe int Crypt(byte[] Buffer, uint Offset, int Size, int Key)
        {
            int result = (Size & 0xFF00) | (Size & 0xFC) / 4;
            if (result > 0)
            {
                fixed (byte* p = Buffer)
                {
                    uint* pBuffer = (uint*)((int)(p + Offset));
                    for (int i = 0; i < result; i++, pBuffer++)
                    {
                        Size = (int)((((*pBuffer ^ ~Key) >> 24) & 0xFF) + (((((*pBuffer ^ ~Key) >> 16) & 0xFF) + ((((byte)(*pBuffer ^ ~Key) << 8) + (((*pBuffer ^ ~Key) >> 8) & 0xFF)) << 8)) << 8));
                        for (byte j = 0; j < 4; j++)
                        {
                            *((byte*)&Size + j) = (byte)((j | (j << j) | Mungify_Table[((byte)(i - (uint)&Size) + (byte)&Size + j) & 0xF] | 0xA5) ^ *((byte*)&Size + j));
                        }
                        *pBuffer = (uint)(Key ^ Size);
                    }
                }
            }
            return result;
        }

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы