Как объявить LARGE_INTEGER в C # - PullRequest
2 голосов
/ 26 марта 2009

код ниже (на C ++) - это то, что я пытаюсь конвертировать в 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;
}

Здесь я попытался перевести код, но он слишком запутанный, и я никогда раньше не работал с Большими целыми числами.

Состав:

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

Переведенная функция:

    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;
}

Проблемы: Первая проблема заключается в том, что я не нашел переменную типа LARGE_INTEGER в C #, поэтому я создал структуру, и я хотел бы знать, существует ли она на самом деле. Что касается второй проблемы, функция не правильная, ничего не работает.

Любая помощь по этому конкретному вопросу будет принята с благодарностью! Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 26 марта 2009

Прямой перевод структуры LARGE_INTEGER будет:

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

Это похоже на объединение в C, где QuadPart является 8-байтовым значением, LowPart занимает первые 4 байта и HighPart занимает старшие 4 байта.

5 голосов
/ 26 марта 2009

Это Int64. На основе http://msdn.microsoft.com/en-us/library/aa383713.aspx, 64-разрядное целое число со знаком.

1 голос
/ 05 июля 2017

Опираясь на предыдущий ответ, я обнаружил, что было полезно расширить определение LARGE_INTEGER, включив в него версии int и uint для верхней и нижней частей:

[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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...