On 26 Feb 2012, at 13:54, ik wrote:

> to the following Pascal record:
> 
> 
> iphdr    = record
> {$IFDEF ENDIAN_LITTLE}
>              jhl     : Cardinal; // __u8      ihl:4,
>              version : Cardinal; // version:4

The ":4" in C means "4 bits", not 4 bytes. The correct translation in the 
general case for bitfields is hard, because FPC does not support C-compatible 
bitpacking (it depends on the type of the bitfield, e.g. "int a:4;" and "char 
a:4" have different alignment rules). In this case, this should match the C 
layout:

{$packrecords c}
iphdr    = record
             bitfields = bitpacked record
{$IFDEF ENDIAN_LITTLE}
               jhl: 0..(1 shl 4)-1;
               version: 0..(1 shl 4)-1;
{$ELSE}
               jhl: 0..(1 shl 4)-1;
               version: 0..(1 shl 4)-1;
{$ENDIF}
             end;
             tos      : cuint8;
             tot_len  : cint16;
             id       : cint16;
             frag_off : cint16;
             ttl      : cint8;
             protocol : cint8;
             check    : cuint16;
             saddr    : cint32;
             daddr    : cint32;
 end;

You will then of course have to use iphdrvar.bitfields.jhl instead of 
iphdrvar.jhl.


Jonas_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to