[英]How to marshal C++ struct containing DWORD bitfields in C#
我正在使用非托管SDK並且有一個我需要在C#中編組的結構:
struct DEV_TIME
{
DWORD second:6;
DWORD minute:6;
DWORD hour:5;
DWORD day:5;
DWORD month:4;
DWORD year:6;
}
我已經四處尋找並嘗試過很多東西,但似乎無法弄明白。 這是我閱讀大量帖子后的最新嘗試:
[StructLayout(LayoutKind.Sequential)]
public struct DHDEVTIME
{
internal uint secData;
internal uint minData;
internal uint hourData;
internal uint dayData;
internal uint monData;
internal uint yearData;
public uint second
{
get { return secData & 0x3F; }
set { secData = (secData % ~0x3Fu) | (value & 0x3F); }
}
public uint minute
{
get { return minData & 0x3F; }
set { minData = (minData % ~0x3Fu) | (value & 0x3F); }
}
public uint hour
{
get { return hourData & 0x1F; }
set { hourData = (hourData % ~0x1Fu) | (value & 0x1F); }
}
public uint day
{
get { return dayData & 0x1F; }
set { dayData = (dayData % ~0x1Fu) | (value & 0x1F); }
}
public uint month
{
get { return monData & 0xF; }
set { monData = (monData % ~0xFu) | (value & 0xF); }
}
public uint year
{
get { return yearData & 0x3F; }
set { yearData = (yearData % ~0x3Fu) | (value & 0x3F); }
}
}
這個結構是對SDK的調用的一部分,它包含其他結構等。長話短說,我不是100%確定這是否是錯誤的,是導致調用不能正常工作的原因。 我從來沒有處理過像這樣的結構,所以我認為這是最可能的原因。 如果這看起來是正確的,請告訴我,我將發布更多其他代碼。 一開始就試着保持簡約。
UPDATE
感謝@Ben Voigt指出我正確的方向。 以下是供將來參考的正確代碼:
[StructLayout(LayoutKind.Sequential)]
public struct DHDEVTIME
{
internal uint data;
public uint second
{
get { return data & 0x3F; }
set { data = (data & ~0x3Fu) | (value & 0x3F); }
}
public uint minute
{
get { return (data >> 6) & 0x3F; }
set { data = (data & ~(0x3Fu << 6)) | (value & 0x3F) << 6; }
}
public uint hour
{
get { return (data >> 12) & 0x1F; }
set { data = (data & ~(0x1Fu << 12)) | (value & 0x1F) << 12; }
}
public uint day
{
get { return (data >> 17) & 0x1F; }
set { data = (data & ~(0x1Fu << 17)) | (value & 0x1F) << 17; }
}
public uint month
{
get { return (data >> 22) & 0xF; }
set { data = (data & ~(0xFu << 22)) | (value & 0xF) << 22; }
}
public uint year
{
get { return (data >> 26) & 0x3F; }
set { data = (data & ~(0x3Fu << 26)) | (value & 0x3F) << 26; }
}
}
整個結構中只有一個32位整數。 所有各種組件都被打包到32位結構的不同子集中。
您可能希望在.NET端只使用一個UInt32
字段,以及訪問各個組件的屬性。 .NET BitVector32
類可以幫助您提取和更新單個32位字段中的位域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.