2016-12-10 14 views
2

Мне нужно преобразовать структуру ниже в delphi. Я сомневаюсь, что это значение «: 4» означает в «зарезервированных» и «версий» членах. Похоже, что это мешает размеру структуры! Кто-нибудь с советами?Convert C structure to delphi

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

А, спасибо, я просто хотел опубликовать ту же ссылку (вторая).

6

Как уже сказано, это битполе, то есть набор бит, которые вместе образуют байты, слова или слова.

Самое простое решение:

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; 

Менее простой (но более общее) решение и объяснение можно найти в моей статье: http://rvelthuis.de/articles/articles-convert.html#bitfields, к которой Ули уже связаны между собой.

 Смежные вопросы

  • Нет связанных вопросов^_^