2
我移植以下從拆解的x86二進制C代碼時:整蠱整數溢出移植C到C#
(unsigned __int16) ~ (_WORD) crc32^length * ~crc32;
這是我在C#中移植的代碼:
(uint) (~(ushort) crc32)^length * ~crc32)
而且下面有表與一些計算值。
Expected | Actual (C#)
-----------+------------
0x1082B9CB | 0x6082B9CB
0x30389AF7 | 0x20389AF7
0xD0EF1CD6 | 0xE0EF1CD6
正如你所看到的,最後三個字節是正確的。只是第一個字節幾乎沒有移位,但我看不出任何模式與其他模式的區別。
任何想法如何解決我的C#代碼,所以它給予預期的輸出?
示例值(C#語法):
uint crc32 = 0x7601A9C5;
int length = 17;
他們應該評估爲0xD0EF1CD6
,但給0xE0EF1CD6
代替。
編輯: 我可能忘了提及一件重要的事情。輸出以十六進制符號的底層原始字節表示。
工作的代碼示例:https://ideone.com/Z8eONJ
Console.WriteLine(BitConverter.ToString(BitConverter.GetBytes(checksum)));
你能舉出'crc32'和''長度'應該使你的期望值的例子值嗎? – vcsjones
看起來你的演員陣容倒退了。 '_WORD - > uint','__int16-> ushort' –
@RobertMcKee:我認爲__int16和ushort在C#中是相等的?這不正確嗎?我添加了示例值,所以如果您認爲它有幫助,請添加答案。 – stil