преобразование структуры в delphi - PullRequest
0 голосов
/ 13 ноября 2010

может кто-нибудь сказать мне, мой разговор от c до delphi хорошо:

код C

struct nfq_data {
    /* packet_hdr - it HAVE to be the same as struct nfqnl_msg_packet_hdr */
    struct {
        uint32_t packet_id; /* unique ID of packet in queue in network order */
        uint16_t hw_protocol; /* hw protocol in network order */
        uint8_t hook; /* netfilter hook */
    } packet_hdr;
    /* packet_hw - it HAVE to be the same as struct nfqnl_msg_packet_hw */
    struct {
        uint16_t hw_addrlen; /* len of hw_addr in network order */
        uint16_t _pad;
        uint8_t hw_addr[8];
    } packet_hw;
    /* tm */
    struct {
        long sec;
        long usec;
    } tm;

    uint32_t if_index; /* Unique iface id */
    uint32_t verdict; /* Netfilter verdict value */
    uint32_t mark; /* Mark value */
    uint8_t if_name[IFNAMSIZE]; /* Name of incoming or outgoing iface */
    uint32_t data_len; /* Length of packet */
    uint8_t payload[0]; /* packet data */
};

, где

typedef unsigned char uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;

Delphi

_packet_hdr = record
    packet_id: Cardinal;
    hw_protocol: Word;
    hook: Byte;
  end;

  _packet_hw = record
    hw_addrlen: Word;
    _pad: Word;
    hw_addr: array[0..7] of byte;
  end;

  _tm = record
    sec: Int64;
    usec: Int64;
  end;

  pnfq_data = ^nfq_data;
  nfq_data = record
    packet_hdr: _packet_hdr;
    packet_hw: _packet_hw;
    tm: _tm;
    if_index: Cardinal;
    verdict: Cardinal;
    mark: Cardinal;
    if_name: array[0..254] of Byte;
    data_len: Cardinal;
    payload: PChar; //TBytes;
  end;

    packet_hdr: _packet_hdr;
    packet_hw: _packet_hw;

Я хорошо получаю, но после этого ничего не хорошо.

Заранее спасибо

Боян

Ответы [ 3 ]

1 голос
/ 13 ноября 2010
uint8_t payload[0];

Это действительно указатель (как в вашем delphi-коде) или массив на месте размером 0, используемый для представления данных, следующих за заголовком

И вы должны пометить свои записи как packed. Не думаю, что это имеет значение в вашем конкретном коде, но это хорошая практика, поскольку правила упаковки легко ошибиться, могут измениться, и не все их знают.
Это, вероятно, имеет значение, потому что package_hdr составляет 7 байт при упаковке, поэтому следующий пакет_hw начинается со смещения 7 при упаковке и, вероятно, с 8 при выравнивании.

0 голосов
/ 13 ноября 2010

На основании вашего комментария "Я получаю хорошо, но после них ничего не получается."

Я предполагаю, что вы получаете данные из приложения "C"-

Посмотрите на " Запись поля aliment " на экране опций генерации кода "delphi compiler". Существует несколько различных опций, таких как "Quad Word" или "Word", выравнивание..

0 голосов
/ 13 ноября 2010

Я думаю, вам нужно окружить вашу структуру #pragma pack(push,1) / #pragma pack(pop) (если мы говорим о Visual Studio).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...