How to declarate LARGE_INTEGER in C#

こ雲淡風輕ζ 提交于 2019-12-24 04:30:05

问题


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.


回答1:


A direct translation of the LARGE_INTEGER structure would be:

[StructLayout(LayoutKind.Explicit, 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.




回答2:


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




回答3:


Building on a previous answer I found that it was useful to extend the definition of LARGE_INTEGER to include int and uint versions of the high and low parts:

[StructLayout(LayoutKind.Explicit, Size=8)]
struct LARGE_INTEGER
    {
    [FieldOffset(0)]public long QuadPart;

    [FieldOffset(0)]public uint LowPart;
    [FieldOffset(4)]public int HighPart;

    [FieldOffset(0)]public int LowPartAsInt;
    [FieldOffset(0)]public uint LowPartAsUInt;

    [FieldOffset(4)]public int HighPartAsInt;
    [FieldOffset(4)]public uint HighPartAsUInt;
    }


来源:https://stackoverflow.com/questions/683491/how-to-declarate-large-integer-in-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!