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

Method addfield

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

Source from the content-addressed store, hash-verified

294 return self.fmt[-1] == "f"
295
296 def addfield(self, pkt, s, val):
297 # type: (Packet, bytes, Optional[Union[int, float]]) -> bytes
298 if not isinstance(pkt, SignalPacket):
299 raise Scapy_Exception("Only use SignalFields in a SignalPacket")
300
301 val = self.i2m(pkt, val)
302
303 if self._is_little_endian():
304 msb_pos = self.start + self.size - 1
305 lsb_pos = self.start
306 shift = lsb_pos
307 fmt = "<Q"
308 else:
309 msb_pos = self.start
310 lsb_pos = self._lsb_lookup(self.start, self.size)
311 shift = (64 - self._msb_lookup(msb_pos) - self.size)
312 fmt = ">Q"
313
314 field_len = max(msb_pos, lsb_pos) // 8 + 1
315 if len(s) < field_len:
316 s += b"\x00" * (field_len - len(s))
317
318 if self._is_float_number():
319 int_val = struct.unpack(self.fmt[0] + "I",
320 struct.pack(self.fmt, val))[0] # type: int
321 elif self._is_signed_number():
322 int_val = self._convert_to_unsigned(int(val), self.size)
323 else:
324 int_val = cast(int, val)
325
326 pkt_val = struct.unpack(fmt, (s + b"\x00" * 8)[:8])[0]
327 pkt_val |= int_val << shift
328 tmp_s = struct.pack(fmt, pkt_val)
329 return tmp_s[:len(s)]
330
331 def getfield(self, pkt, s):
332 # type: (Packet, bytes) -> Tuple[bytes, Union[int, float]]

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_unsignedMethod · 0.95
Scapy_ExceptionClass · 0.90
i2mMethod · 0.45

Tested by

no test coverage detected