[英]LARGE_INTEGER value gets changed while marshalling : from LARGE_INTEGER to UINT64 (C) to C#'s uint64
[英]How to declarate LARGE_INTEGER in C#
下面的代碼(在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;
}
問題:第一個問題是我沒有在C#中找到一個LARGE_INTEGER類型變量,所以我創建了一個結構,我想知道是否確實存在。 至於第二個問題,功能不對,沒有用。
任何有關該特定問題的幫助都將非常感謝! 先感謝您。
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個字節。
它的Int64。 基於http://msdn.microsoft.com/en-us/library/aa383713.aspx ,它是一個64位有符號整數。
基於之前的答案,我發現擴展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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.