class EthernetFrame(Structure): preamble_sof = Magic('\xAA' * 8) # 8 bytes of 10101010 mac_dest = UBInt8Sequence(6) mac_source = UBInt8Sequence(6) ethertype = DispatchField(UBInt16()) payload = DispatchTarget(None, ethertype, { 0x0800: IPV4Frame, # 0x85DD: IPV6Message, # 0x0806: ARPMessage, }) checksum = UBInt32()
class Frame(Structure): version = UBInt8() operation = UBInt8() result = UBInt16() reserved_0 = Magic('\x00\x00\x00\x00') _host_mac = UBInt8Sequence(6) host_mac = FieldProperty(_host_mac, onget=lambda v: unpack_mac(''.join(map(chr, v))), onset=lambda v: tuple(map(ord, pack_mac(v)))) _device_mac = UBInt8Sequence(6) device_mac = FieldProperty( _device_mac, onget=lambda v: unpack_mac(''.join(map(chr, v))), onset=lambda v: tuple(map(ord, pack_mac(v)))) reserved_1 = Magic('\x00\x00') sequence = UBInt16() signature = Magic('NSDP') reserved_2 = Magic('\x00\x00\x00\x00') messages = FieldArray(Message)
class SuperMessage(Structure): magic = Magic(b'\xAA\xAA') # bitfield options = BitField(8, b1=BitBool(), b2=BitBool(), rest=BitNum(6)) # unsigned big endian ubint8 = UBInt8() ubint16 = UBInt16() ubint24 = UBInt24() ubint32 = UBInt32() ubint64 = UBInt64() # signed big endian sbint8 = SBInt8() sbint16 = SBInt16() sbint32 = SBInt32() sbint64 = SBInt64() # unsigned little endian ulint8 = ULInt8() ulint16 = ULInt16() ulint32 = ULInt32() ulint64 = ULInt64() # signed little endian slint8 = SLInt8() slint16 = SLInt16() slint32 = SLInt32() slint64 = SLInt64() # optional optional_one = ConditionalField(UBInt8(), lambda m: m.options.b1) optional_two = ConditionalField(UBInt8(), lambda m: m.options.b2) # sequences with variable lengths ubseql = LengthField(UBInt8()) ubseq = UBInt8Sequence(ubseql) sbseql = LengthField(UBInt8()) sbseq = SBInt8Sequence(sbseql) # sequences with fixed lengths ubseqf = UBInt8Sequence(5) sbseqf = SBInt8Sequence(5) # don't change anything... for test coverage ulint16_value = FieldProperty(ulint16) ulint16_byte_string = FieldProperty( ulint16, onget=lambda v: str(v), onset=lambda v: struct.unpack(">H", v)[0]) message_type = DispatchField(UBInt8()) submessage_length = LengthField(UBInt16()) submessage = DispatchTarget(submessage_length, message_type, {0xEF: SuperChild}) # checksum starts after beginning magic, ends before # the checksum crc = CRCField(UBInt16(), crc16_ccitt, 2, -3) eof = Magic(b'~')
class MyDefaultTargetMessage(Structure): _length = LengthField(DependentField('length')) sequence = UBInt8Sequence(_length)
class MyOtherTargetMessage(Structure): #: Inherited from the parent message _length = LengthField(DependentField('length')) sequence = UBInt8Sequence(_length)
class MyVarSeqMessage(Structure): s = VariableRawPayload(None) b = UBInt8Sequence(None)
class MyVarSeqMessage(Structure): type = UBInt8() length = LengthField(UBInt8()) seq = UBInt8Sequence(length)
class MySeqMessage(Structure): type = UBInt8() byte_values = UBInt8Sequence(16)
class MyMessage(Structure): _version = UBInt8Sequence(2) version = FieldProperty( _version, onget=lambda v: "%d.%02d" % (v[0], v[1]), onset=lambda v: tuple(int(six.b(x)) for x in v.split(".", 1)))