Работа с указателями и битовые операции (с 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;
}