Rolf B: C mal wieder, Länge einer Binary

Beitrag lesen

Hallo pl,

die struct sollte nicht plattformunabhängig sein, nur ihre Übertragung ins Netz. Definiere den DNS Haader als neutralen Container, z.B. so:

typedef struct {
    uint16_t id;
    uint16_t qr     : 1;
    uint16_t opcode : 4;
    uint16_t aa     : 1;
    uint16_t tc     : 1;
    uint16_t rd     : 1;
    uint16_t ra     : 1;
    uint16_t z      : 3;
    uint16_t rcode  : 4;
    uint16_t qdcount;
    uint16_t ancount;
    uint16_t nscount;
    uint16_t arcount;
} DNS_HEADER;

und schreibe eine Funktion sendDNSHeader(uint8_t* outputbuffer, DNS_HEADER* h), die die entsprechenden compile- oder runtime-Abfragen enthält, um die Endianness zu bestimmen, die Flags korrekt zu packen (das ist nicht trivial, wie Bitfelder auf int abgebildet werden ist komplett compilerabhängig) und die 12 Headerbytes in network order in den Outputbuffer zu schreiben.

Viele Compiler schreiben das erste Bitfield in die niederwertigsten Bits des Container-Int. Wenn Du also speziell für einen Compiler programmierst, der das so macht, könntest Du eine struct definieren die die Bitfelder enthält, müsstest dann nur mit rcode beginnen und mit qr aufhören. Das macht die Arbeit etwas leichter. Diesen Code darfst Du dann aber niemandem geben, der ggf. einen anderen Compiler nutzt. Oder Du musst ein Testprogramm mitliefern, dass die Rahmenbedingungen für den Compiler validiert.

Rolf

--
sumpsi - posui - clusi