On Sun, Feb 26, 2012 at 15:08, Jonas Maebe <jonas.ma...@elis.ugent.be> wrote: > > 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.
I'ved replaced it to iphdr = bitpacked record {$IFDEF ENDIAN_LITTLE} jhl : 0..(1 shl 4)-1; // __u8 ihl:4, version : 0..(1 shl 4)-1; // version:4 {$ELSE} version : 0..(1 shl 4)-1; // __u8 version:4, jhl : 0..(1 shl 4)-1; // version:4 {$ENDIF} tos : cuint8; tot_len : cint16; id : cint16; frag_off : cint16; ttl : cint8; protocol : cint8; check : cuint16; saddr : cint32; daddr : cint32; end; And now all of the problems that I continue to find gone away. Thank you > > > Jonas_______________________________________________ > fpc-pascal maillist - fpc-pascal@lists.freepascal.org > http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal