MCPcopy Create free account
hub / github.com/secdev/scapy / getfield

Method getfield

scapy/layers/can.py:331–366  ·  view source on GitHub ↗
(self, pkt, s)

Source from the content-addressed store, hash-verified

329 return tmp_s[:len(s)]
330
331 def getfield(self, pkt, s):
332 # type: (Packet, bytes) -> Tuple[bytes, Union[int, float]]
333 if not isinstance(pkt, SignalPacket):
334 raise Scapy_Exception("Only use SignalFields in a SignalPacket")
335
336 if isinstance(s, tuple):
337 s, _ = s
338
339 if self._is_little_endian():
340 msb_pos = self.start + self.size - 1
341 lsb_pos = self.start
342 shift = self.start
343 fmt = "<Q"
344 else:
345 msb_pos = self.start
346 lsb_pos = self._lsb_lookup(self.start, self.size)
347 shift = (64 - self._msb_lookup(self.start) - self.size)
348 fmt = ">Q"
349
350 field_len = max(msb_pos, lsb_pos) // 8 + 1
351
352 if pkt.wirelen is None:
353 pkt.wirelen = field_len
354
355 pkt.wirelen = max(pkt.wirelen, field_len)
356
357 fld_val = struct.unpack(fmt, (s + b"\x00" * 8)[:8])[0] >> shift
358 fld_val &= ((1 << self.size) - 1)
359
360 if self._is_float_number():
361 fld_val = struct.unpack(self.fmt,
362 struct.pack(self.fmt[0] + "I", fld_val))[0]
363 elif self._is_signed_number():
364 fld_val = self._convert_to_signed(fld_val, self.size)
365
366 return s, self.m2i(pkt, fld_val)
367
368 def randval(self):
369 # type: () -> Union[RandBinFloat, RandFloat]

Callers

nothing calls this directly

Calls 8

_is_little_endianMethod · 0.95
_lsb_lookupMethod · 0.95
_msb_lookupMethod · 0.95
_is_float_numberMethod · 0.95
_is_signed_numberMethod · 0.95
_convert_to_signedMethod · 0.95
Scapy_ExceptionClass · 0.90
m2iMethod · 0.45

Tested by

no test coverage detected