diff --git a/scapy/fields.py b/scapy/fields.py index cb8bbbf49fc01c49e5147c1e40af14b062485f16..4ea72db7866894906269a5b008ce3bf6f05200fa 100644 --- a/scapy/fields.py +++ b/scapy/fields.py @@ -803,13 +803,22 @@ class FlagsField(BitField): -class FloatField(BitField): - def getfield(self, pkt, s): - s,b = BitField.getfield(self, pkt, s) - - # fraction point between bits 15 and 16. - sec = b >> 16 - frac = b & (1L << (32+1)) - 1 - frac /= 65536.0 - b = sec+frac - return s,b +class FixedPointField(BitField): + def __init__(self, name, default, size, frac_bits=16): + self.frac_bits = frac_bits + BitField.__init__(self, name, default, size) + + def any2i(self, pkt, val): + if val is None: + return val + ival = int(val) + fract = int( (val-ival) * 2**self.frac_bits ) + return (ival << self.frac_bits) | fract + + def i2h(self, pkt, val): + int_part = val >> self.frac_bits + frac_part = val & (1L << self.frac_bits) - 1 + frac_part /= 2.0**self.frac_bits + return int_part+frac_part + def i2repr(self, pkt, val): + return self.i2h(pkt, val) diff --git a/scapy/layers/ntp.py b/scapy/layers/ntp.py index bd1434836bef0f9eda87c7fb67ac963055735152..996d172781831ec26385d9f5d7472cc7c1b59b4c 100644 --- a/scapy/layers/ntp.py +++ b/scapy/layers/ntp.py @@ -67,8 +67,8 @@ class NTP(Packet): BitField('stratum', 2, 8), BitField('poll', 0xa, 8), ### XXX : it's a signed int BitField('precision', 0, 8), ### XXX : it's a signed int - FloatField('delay', 0, 32), - FloatField('dispersion', 0, 32), + FixedPointField('delay', 0, size=32, frac_bits=16), + FixedPointField('dispersion', 0, size=32, frac_bits=16), IPField('id', "127.0.0.1"), TimeStampField('ref', 0, 64), TimeStampField('orig', -1, 64), # -1 means current time