3

I want to encode a message...This is the message that i have generated

from ctypes import memmove, addressof, Structure, c_uint16,c_bool

class AC(Structure):
    _fields_ = [("UARFCN",  c_uint16),
                 ("ValidUARFCN", c_bool ),("PassiveActivationTime", c_uint16) ]

    def __init__(self , UARFCN ,ValidUARFCN , PassiveActivationTime):
            self.UARFCN                 =    UARFCN
            self.ValidUARFCN            =    True
            self.PassiveActivationTime  =    PassiveActivationTime

    def __str__(self):
        s = "AC"
        s += "UARFCN:"  + str(self.UARFCN)
        s += "ValidUARFCN"  + str(self.ValidUARFCN)
        s += "PassiveActivationTime"  +str(self.PassiveActivationTime)
        return s

class ABCD(AC):
        a1 = AC( 0xADFC , True , 2)
        a2 = AC( 13 , False ,5)
        print a1
        print a2

I want to encode it and then store it in a variable.....So how can i do it???

agf
  • 171,228
  • 44
  • 289
  • 238
NOOB
  • 2,717
  • 4
  • 22
  • 22

1 Answers1

4

For C structures, all you have to do to write it to a file is open the file, then do

fileobj.write(my_c_structure).

Then you can reload it by opening the file and doing

my_c_structure = MyCStructure()
fileobj.readinto(my_c_structure)

All you need is to make your __init__ arguments optional. See this post on Binary IO. It explains how to send Structure over sockets or with multiprocessing Listeners.

To save it in a string / bytes just do

from io import BytesIO # Or StringIO on old Pythons, they are the same
fakefile = BytesIO()
fakefile.write(my_c_structure)
my_encoded_c_struct = fakefile.getvalue()

Then read it back out with

from io import BytesIO # Or StringIO on old Pythons, they are the same
fakefile = BytesIO(my_encoded_c_struct)
my_c_structure = MyCStructure()
fakefile.readinto(my_c_structure)

Pickle and the like are not necessary. Neither is struct.pack though it would work. It's just more complicated.

Edit: also see the linked answer at How to pack and unpack using ctypes (Structure <-> str) for another method for doing this.

Edit 2: See http://doughellmann.com/PyMOTW/struct or http://effbot.org/librarybook/struct.htm for struct examples.

Community
  • 1
  • 1
agf
  • 171,228
  • 44
  • 289
  • 238
  • See http://www.doughellmann.com/PyMOTW/struct/ or http://effbot.org/librarybook/struct.htm for `struct` examples. – agf Aug 11 '11 at 08:07