对于感兴趣的人:此记录是windows *** 作系统的LDT_ENTRY记录中的联合的一部分。 (我需要在Delphi中使用这个记录,因为我正在Delphi中使用XBox模拟器 – 请参阅sourceforge上的项目Dxbx)。
无论如何,有关记录定义为:
struct { DWORD BaseMID : 8; DWORD Type : 5; DWORD dpl : 2; DWORD Pres : 1; DWORD limitHi : 4; DWORD Sys : 1; DWORD Reserved_0 : 1; DWORD Default_Big : 1; DWORD Granularity : 1; DWORD BaseHi : 8; } Bits;
据我所知,Delphi没有可能的位域。我试过这个:
Bits = record BaseMID: Byte; // 8 bits _Type: 0..31; // 5 bits dpl: 0..3; // 2 bits Pres: Boolean; // 1 bit limitHi: 0..15; // 4 bits Sys: Boolean; // 1 bit Reserved_0: Boolean; // 1 bit Default_Big: Boolean; // 1 bit Granularity: Boolean; // 1 bit BaseHi: Byte; // 8 bits end;
但是唉:它的大小变成10字节,而不是预期的4。
我想知道我应该如何申报记录,以便我获得相同布局,大小和相同成员的记录。优选没有吸气剂/固定剂的负载。
TIA。
@H_419_18@解决方法 感谢大家!根据这些信息,我将其简化为:
RBits = recordpublic BaseMID: BYTE;private Flags: WORD; function GetBits(const aIndex: Integer): Integer; procedure SetBits(const aIndex: Integer; const aValue: Integer);public BaseHi: BYTE; property _Type: Integer index{$OPTIMIZATION ON}{$OVERFLOWCHECKS OFF}function RBits.GetBits(const aIndex: Integer): Integer;var Offset: Integer; NrBits: Integer; Mask: Integer;begin NrBits := aIndex and $FF; Offset := aIndex shr 8; Mask := ((1 shl NrBits) - 1); Result := (Flags shr Offset) and Mask;end;procedure RBits.SetBits(const aIndex: Integer; const aValue: Integer);var Offset: Integer; NrBits: Integer; Mask: Integer;begin NrBits := aIndex and $FF; Offset := aIndex shr 8; Mask := ((1 shl NrBits) - 1); Assert(aValue <= Mask); Flags := (Flags and (not (Mask shl Offset))) or (aValue shl Offset);end;05 read GetBits write SetBits; // 5 bits at offset 0 property dpl: Integer index 02 read GetBits write SetBits; // 2 bits at offset 5 property Pres: Integer index 01 read GetBits write SetBits; // 1 bit at offset 7 property limitHi: Integer index 04 read GetBits write SetBits; // 4 bits at offset 8 property Sys: Integer index C01 read GetBits write SetBits; // 1 bit at offset 12 property Reserved_0: Integer index D01 read GetBits write SetBits; // 1 bit at offset 13 property Default_Big: Integer index E01 read GetBits write SetBits; // 1 bit at offset 14 property Granularity: Integer index F01 read GetBits write SetBits; // 1 bit at offset 15end;
索引编码如下:(BitOffset shl 8)NrBits。其中1≤NrBits<= 32且0 <= BitOffset = 31 现在,我可以得到并设置这些位如下:
很漂亮,你不觉得吗?
PS:Rudy Velthuis现在在他的优秀“Pitfalls of converting”-article中包含了这个修订版本。
总结以上是内存溢出为你收集整理的如何模拟Delphi记录中的位域?全部内容,希望文章能够帮你解决如何模拟Delphi记录中的位域?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)