Reading binary using a struct - behavour not as expected?

Discussion in 'Python' started by richardd, Apr 5, 2004.

  1. richardd

    richardd Guest

    I am writing code to deal with PCAP files. I have a PCAP dump and I am
    looking at the timestamps in the PCAP packet headers to see if they are in
    the correct order in the file. To do this I have a class called
    PCAPPacketHdr as follows

    import struct

    class PCAPPacketHdr:
    FormatString = "LLLL"
    TSSec = None
    TSUSec = None
    InclLen = None
    OrigLen = None

    def Pack(self):
    return struct.pack( self.FormatString, self.TSSec, self.TSUSec,
    self.InclLen, self.OrigLen )

    def Unpack(self, buffer):
    self.TSSec, self.TSUSec, self.InclLen, self.OrigLen =
    struct.unpack( self.FormatString, buffer )

    def Size(self):
    return struct.calcsize (self.FormatString)

    I then have code which opens up the file (skipping the PCAP file magic
    number and PCAP file header), and reads in each packet header as follows:

    while not eof:
    #read in PCAPPacketHdr
    buf =
    if len(buf) == packetHdr.Size():
    if lastPacketHdr != None:
    if lastPacketHdr.TSSec > packetHdr.TSSec:
    outputFile.write("ERROR: Packet TSSec earlier than last
    one: \n")
    outputFile.write(" Last Packet
    elif lastPacketHdr.TSSec == packetHdr.TSSec:
    if lastPacketHdr.TSUSec > packetHdr.TSUSec:
    outputFile.write("ERROR: Packet TSUSec earlier than
    last one\n")
    outputFile.write(" Last Packet
    outputFile.write(" Packet
    lastPacketHdr = copy.deepcopy(packetHdr)
    #skip packet payload
    packetPayload =
    eof = True

    This code appears to work fine for extracting the timestamps from the file,
    the repr( ) calls on the timestamps allow me to write them to the output
    file correctly, it's just the comparison operators don't appear to be
    working as I would expect. It appears than when the TSUSec timestamp is the
    same as the previous one in the data I input, it reports "ERROR: Packet
    TSUSec earlier than last one".

    This makes me think that the comparison operators aren't acting on the data
    as longs as I expected.

    Can anyone shed some light on what I'm doing wrong, I'm still very new to

    Thanks in advance,

    richardd, Apr 5, 2004
    1. Advertisements

  2. richardd

    Larry Bates Guest


    Ok, your problem is this:

    When you define attributes immediately after
    the class definition they are SHARED among
    all instances of the class. Basically they are
    global (actually this can come in handy if you
    want to keep counters across class instances).
    You were copying into lastcopy, but everytime
    you unpacked, you overwrote your shared attributes.

    Try this instead:

    class PCAPPacketHdr:
    # Attributes defined here are global across
    # instances of this class.
    FormatString = "LLLL"

    def __init__(self):
    # Attributes defined here are local to
    # the class instance.
    self.TSSec = None
    self.TSUSec = None
    self.InclclLen = None
    self.OrigLen = None

    This will share FormatString (it doesn't change),
    but have individual attributes for the other
    values you wish to be unique between two different
    instances of the class.

    Larry Bates
    Syscon, Inc.
    Larry Bates, Apr 7, 2004
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.