2016-12-10 11 views
2

以下の構造をデルファイに変換する必要があります。私は、この ":4"値が "予約済み"メンバーと "バージョン"メンバーで何を意味するのか疑問に思っています。それは構造のサイズに干渉するように見えます!任意のヒントを持つ誰ですか?C構造をデルファイに変換する

typedef struct _FSRTL_COMMON_FCB_HEADER { 
    CSHORT  NodeTypeCode; 
    CSHORT  NodeByteSize; 
    UCHAR   Flags; 
    UCHAR   IsFastIoPossible; 
    UCHAR   Flags2; 
    UCHAR   Reserved :4; 
    UCHAR   Version :4; 
    PERESOURCE Resource; 
    ... 
+0

ビット数。 –

+1

タグ付きPascal以来のレコード:Free Pascalはビットフィールドをサポートしています。 –

答えて

3

これらはビットフィールドです。それらはDelphiで直接サポートされていませんが、回避策があります。here、特にhereを参照してください。

+0

ああ、ありがとう、私はちょうど同じリンク(2番目)を投稿したいと思います。

6

コメントはすでに述べたように、これはビットフィールド、つまり一緒になってバイト、ワード、またはワードを形成するビットのセットです。

最も簡単な解決策は以下のとおりです。http://rvelthuis.de/articles/articles-convert.html#bitfields、ウリはすでにリンクする:

type 
    _FSRTL_COMMON_FCB_HEADER = record 
    private 
    function GetVersion: Byte; 
    procedure SetVersion(Value: Byte); 
    public 
    NodeTypeCode: Word; 
    ... 
    ReservedVersion: Byte; // low 4 bits: reserved 
          // top 4 bits: version 
    // all other fields here 

    property Version: Byte read GetVersion write SetVersion; 
    // Reserved doesn't need an extra property. It is not used. 
    end; 

    ... 

implementation 

function _FSRTL_COMMON_FCB_HEADER.GetVersion: Byte;  
begin 
    Result := (ReservedVersion and $F0) shr 4; 
end; 

procedure _FSRTL_COMMON_FCB_HEADER.SetVersion(Value: Byte); 
begin 
    ReservedVersion := (Value and $0F) shl 4; 
end; 

少ないシンプルな(しかし、より一般的な)解決策と説明は私の記事で見つけることができます。

関連する問題