vb6与c#的异或(XOR)

时间:2015-02-26 18:04:26

标签: c# vb6 xor

我正在将一个vb6程序转换为c#,我无法弄清楚为什么我的独占或操作的结果给了我不同的值。

vb6代码:

'serialNum = 884167284, and dSize = 1953312760 here'
serialNum = serialNum Xor dSize       'serialNum = 1088322956 after this operation'
serialNum = serialNum Xor &HD7BF3A9C  'serialNum = -1755232496 after this operation'
GetDriveSerialNum = serialNum

c#代码:

//serialNum = 884167284, and dSize = 1953312760 here
serialNum = serialNum ^ dSize;       //serialNum = 1088322956 after this operation
serialNum = serialNum ^ 0xD7BF3A9C;  //serialNum = 2539734800 after this operation
return serialNum;

我需要c#代码来给出作为vb6代码结果的负数。我能做些什么来实现这个目标?

3 个答案:

答案 0 :(得分:3)

C#long数据类型是64位长有符号整数。 VB6 long数据类型是32位有符号整数。因此在VB6中,您获得了操作集的符号位,而在C#中则未设置。

在C#中使用32位整数类型(int / Int32)。

答案 1 :(得分:2)

vb6中的long是32位有符号值,因此它的范围是 - 2,147,483,468到2,147,483,468。

C#中的long是64位有符号值,因此其范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。

在vb6 XOR中你溢出,因此数字为负数。要获得相同的值,可以在C#中使用int

答案 2 :(得分:0)

只要VB6中的long数据类型是32位有符号整数,并且在C#中它是64位有符号整数,您需要在C#中使用uint数据类型。

        uint serialNum = 884167284;
        uint dSize = 1953312760;

        serialNum = serialNum ^ dSize;
        serialNum = serialNum ^ 0xD7BF3A9C;

        //Your signed representation -1755232496.
        int serialNumSigned = (int)serialNum;