class default(pstruct.type): def __data(self): n = self['length'].li.int() - 4 return dyn.clone(TPDU, blocksize=lambda s: n) _fields_ = [ (ptype.type, '(version)'), # 1 byte version (bigendian(pint.uint8_t), 'reserved'), (bigendian(pint.uint16_t), 'length'), (__data, 'data'), ] def blocksize(self): return self['length'].int()
class _Data2and3(pint.bigendian(pint.uint16_t)): def str(self): res = 2 * self.size() return "{:0{:d}x}".format(self.int(), res) def summary(self): return self.str()
class TPDU(pstruct.type): def __data(self): s = self['length'].li.int() if s < 2: logging.info("%s : length is (%d < 2)", self.shortname(), s) return dyn.block(0) return X224.Get(self['type'].li['high'], s - 2) def __data(self): s = self['length'].li.int() if s < 2: logging.info("%s : length is (%d < 2)", self.shortname(), s) return dyn.block(0) try: result = X224.Lookup(self['type'].li['high']) except KeyError: result = dyn.block(s - 2) return result class __type(pbinary.struct): _fields_ = [(4, 'high'), (4, 'low')] _fields_ = [ (bigendian(uint8_t), 'length'), (__type, 'type'), (__data, 'data'), (X224ParameterArray, 'param'), # (lambda s: dyn.block(s.blocksize() - (s['data'].size() + 2)), 'extra'), # XXX ]
class CLSID(pstruct.type): from ptypes.pint import littleendian, bigendian _fields_ = [ (littleendian(pint.uint32_t), 'a'), (littleendian(pint.uint16_t), 'b'), (littleendian(pint.uint16_t), 'c'), # 64 (bigendian(pint.uint16_t), 'd'), (bigendian(dyn.clone(pint.uint_t, length=6)), 'e') ] def summary(self): result = [] for k, v in self.items(): count = v.size() * 2 fmt = '%0' + str(count) + 'x' result.append(fmt % int(v)) return '{' + '-'.join(result) + '}'
class _Data4(pint.bigendian(pint.uint64_t)): def str(self): res = bytearray(self.serialize()) d1 = ''.join(map('{:02x}'.format, res[:2])) d2 = ''.join(map('{:02x}'.format, res[2:])) return '-'.join([d1, d2]) def summary(self): return self.str()
def test_int_bigendian_uint32_set(): a = pint.bigendian(pint.uint32_t)(source=provider.string(string1)).l a.set(0x0abcdef0) if a.int() == 0x0abcdef0 and a.serialize() == string1: raise Success print a, a.serialize().encode('hex')