C # Как представить (unsigned long) (unsigned int) (ulong) (uint) с помощью XOR (^)

Я конвертирую код C++ в C#

Скажем, я получил это на С++

int v5;
v5 = (*(_DWORD *)(v4 + 68) ^ (unsigned __int64)(unsigned int)(*(_DWORD *)(v4 + 56) ^ *(_DWORD *)(v4 + 20))) % 9;

В С# это было бы так..

   int v5;
   v5 = (int)((BitConverter.ToInt32(v4, 68) ^ (ulong)(uint)(BitConverter.ToInt32(v4, 56) ^ BitConverter.ToInt32(v4, 20))) % 9);

Но я получаю ошибки.. с (ulong) , (uint)

Оператор «^» нельзя применять к операндам типа «int» и «ulong».

Я должен делать

(int)(ulong)(uint)(...)

или что?


person SSpoke    schedule 06.09.2011    source источник
comment
Тип v4 актуален, укажите его.   -  person Jon    schedule 06.09.2011
comment
Почему бы не использовать BitConvert.ToUint64?   -  person Bas    schedule 06.09.2011
comment
v4 - это int .. просто сканер указателя, преобразовать что в UInt64?   -  person SSpoke    schedule 06.09.2011
comment
поверьте мне, все это *(_DWORD *)(v4 + XX) дерьмо обрабатывается BitConverter.ToInt32(v4, XX) очень хорошо.. Я проверил это с другими фрагментами.. но этот действительно поставил меня в тупик. с xor.. и ulong   -  person SSpoke    schedule 06.09.2011
comment
Используйте BitConvert.ToUInt32 вместо ToInt32 и потеряете часть бросков. Верное преобразование должно выглядеть примерно так: (int)((BitConvert.ToUInt32(v4, 68) ^ (ulong)BitConvert.ToUInt32(v4, 56) ^ BitConvert.ToUInt32(v4, 20)) % 9);   -  person user786653    schedule 06.09.2011
comment
вау, user786653, работает ОТЛИЧНО!! Большое спасибо, благослови вас бог, опубликуйте это как ответ ... и я приму его.   -  person SSpoke    schedule 06.09.2011


Ответы (1)


Используйте BitConvert.ToUInt32 (соответствует типу DWORD из программирования Win32 C++) вместо ToInt32 (обычно int), это должно помочь вам потерять некоторые приведения и исправить некоторые проблемы с типами.

Точное преобразование должно быть примерно таким, хотя я не думаю, что необходимо иметь промежуточное приведение к ulong (поскольку 32 старших бита игнорируются, когда мы делаем мод 9 в любом случае, и я думаю, что они всегда будут заканчиваться как 0):

(int)((BitConvert.ToUInt32(v4, 68) ^ (ulong)BitConvert.ToUInt32(v4, 56) ^ BitConvert.ToUInt32(v4, 20)) % 9);
person user786653    schedule 06.09.2011