From 1d1768bb80b6c23361f91fa65b5a2e496c715c37 Mon Sep 17 00:00:00 2001 From: Phil <phil@secdev.org> Date: Thu, 14 Aug 2008 02:09:49 +0200 Subject: [PATCH] Renamed FloatField into FixedPointField and fixed it (inspired by wam patch, ticket #119) --- scapy/fields.py | 29 +++++++++++++++++++---------- scapy/layers/ntp.py | 4 ++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/scapy/fields.py b/scapy/fields.py index cb8bbbf4..4ea72db7 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 bd143483..996d1727 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 -- GitLab