tags:

views:

1194

answers:

2

Hello,

the code below(in C++) is what I am trying the convert into C#

DWORD Func_X_4(DWORD arg1, DWORD arg2, DWORD arg3)
{
LARGE_INTEGER result = {1, 0};
LARGE_INTEGER temp1 = {0};
LARGE_INTEGER temp2 = {0};
LARGE_INTEGER temp3 = {0};
LARGE_INTEGER temp4 = {0};
for(int x = 0; x < 32; ++x)
{
 if(arg2 & 1)
 {
  temp1.LowPart = arg3;
  temp1.HighPart = 0;
  temp2.QuadPart = temp1.QuadPart * result.QuadPart;
  temp3.LowPart = arg1;
  temp3.HighPart = 0;
  temp4.QuadPart = temp2.QuadPart % temp3.QuadPart;
  result.QuadPart = temp4.QuadPart;
 }
 arg2 >>= 1;
 temp1.LowPart = arg3;
 temp1.HighPart = 0;
 temp1.QuadPart *= temp1.QuadPart;
 temp2.LowPart = arg1;
 temp2.HighPart = 0;
 temp3.QuadPart = temp1.QuadPart % temp2.QuadPart;
 arg3 = temp3.LowPart;
 if(!arg2)
  break;
}
return result.LowPart;
}

Here I tried to translate the code,but it's too messy and I never worked with Large integers before.

Structure:

public struct LARGE_INTEGER
{
    UInt32 LowPart;
    Int32 HighPart;
    Int32 QuadPart;
}

Translated function:

    public Int32 Func_X_4(Int32 arg1, Int32 arg2, Int32 arg3)
    {
 LARGE_INTEGER result = {1, 0}; //this and the four below,are they correct?
 LARGE_INTEGER temp1 = {0, 0};
 LARGE_INTEGER temp2 = {0, 0};
 LARGE_INTEGER temp3 = {0, 0};
 LARGE_INTEGER temp4 = {0, 0};
 for(int x = 0; x < 32; ++x)
 {
  if(arg2 & 1==0) //correct?
  {
   temp1.LowPart = arg3;
   temp1.HighPart = 0;
   temp2.QuadPart = temp1.QuadPart * result.QuadPart;
   temp3.LowPart = arg1;
   temp3.HighPart = 0;
   temp4.QuadPart = temp2.QuadPart % temp3.QuadPart;
   result.QuadPart = temp4.QuadPart;
  }
  arg2 >>= 1;
  temp1.LowPart = arg3;
  temp1.HighPart = 0;
  temp1.QuadPart *= temp1.QuadPart;
  temp2.LowPart = arg1;
  temp2.HighPart = 0;
  temp3.QuadPart = temp1.QuadPart % temp2.QuadPart;
  arg3 = temp3.LowPart;
  if(arg2 != 0) //correct?
  break;
 }
 return result.LowPart;
}

Problems: The first problem is that I haven't found a LARGE_INTEGER type variable in C#,so I created a strucure,I'd like to know if there is actually. As for the second problem,the function is not right,nothing worked.

Any help on that particular question will be greatfuly appreciated! Thank you in advance.

+3  A: 

Its Int64. Based on http://msdn.microsoft.com/en-us/library/aa383713.aspx, its a 64 bit-signed integer.

eglasius
Indeed, though normally the keyword "long" would be preferred in C#.
Greg Beech
+3  A: 

A direct translation of the LARGE_INTEGER structure would be:

[StructLayout(LayoutKind.Absolute, Size=8)]
struct LARGE_INTEGER
{
    [FieldOffset(0)]public Int64 QuadPart;
    [FieldOffset(0)]public UInt32 LowPart;
    [FieldOffset(4)]public Int32 HighPart;
}

It's like a union in C, where QuadPart is an 8-byte value, with LowPart occupying the first 4 bytes and HighPart occupying the high 4 bytes.

Jim Mischel