Я портирование следующего кода C из разобранных x86 двоичных:Tricky Целочисленного переполнения при переносе C на C#
(unsigned __int16) ~ (_WORD) crc32^length * ~crc32;
Это мой перенесенный код в C#:
(uint) (~(ushort) crc32)^length * ~crc32)
А внизу есть таблица с некоторыми расчетными значениями.
Expected | Actual (C#)
-----------+------------
0x1082B9CB | 0x6082B9CB
0x30389AF7 | 0x20389AF7
0xD0EF1CD6 | 0xE0EF1CD6
Как вы можете видеть, последние три байта верны. Просто первый байт немного сдвинут, но я не вижу никакой картины, как он отличается друг от друга.
Любые идеи, как исправить мой код на C#, чтобы он дал ожидаемый результат?
Примеры значений (С # синтаксис):
uint crc32 = 0x7601A9C5;
int length = 17;
Они должны оценивать с 0xD0EF1CD6
, но дают 0xE0EF1CD6
вместо этого.
Edit: Я, вероятно, забыл упомянуть важную вещь. Вывод представлен в виде базовых необработанных байтов в шестнадцатеричной нотации.
Рабочий пример кода: https://ideone.com/Z8eONJ
Console.WriteLine(BitConverter.ToString(BitConverter.GetBytes(checksum)));
Можете ли вы привести примеры значений для 'crc32' и' length', которые должны делать ваши ожидаемые значения? – vcsjones
Кажется, что ваши броски назад. '_WORD -> uint',' __int16-> ushort' –
@RobertMcKee: Я думал, что __int16 и ushort равны в C#? Разве это не правда? Я добавил примеры значений, поэтому, если вы считаете, что это помогает, добавьте ответ. – stil