Interconvert a ctypes.Structure to/from a binary string?

Andrew P. Lentvorski, Jr. bsdder at gmail.com
Sat Aug 2 19:20:02 EDT 2008


On Aug 1, 11:35 pm, Andrew Lentvorski <bs... at allcaps.org> wrote:
> Basically, I'd like to use the ctypes module as a much more descriptive
> "struct" module.
>
> Is there a way to take a ctypes.Structure-based class and convert it
> to/from a binary string?
>
> Thanks,
> -a

After chugging through the ctypes source code, I found that I can
abuse ctypes into doing what I want.

Here is how I did it.  I can abuse
string_at(addressof(SomeCtypesClass), length) to get a binary string
out of ctypes while I use:

def analyze_elf_header(binaryData):
    headerSize = ctypes.sizeof(Elf32_Ehdr)
    header = Elf32_Ehdr()

    # Abuse ctypes to initialize from a string
    bb = ctypes.create_string_buffer(binaryData[0:headerSize])
    ctypes.memmove(ctypes.addressof(header), ctypes.addressof(bb),
headerSize)

To jam stuff into a ctypes class.  This seems like an oversight in the
module though.  It would really be better if the class itself had
methods to init from/produce to a binary string.

However, I would prefer that somebody who actually knows ctypes to
weigh in here with comments about what I did.

Thanks,
-a



More information about the Python-list mailing list