ctypes in python failed to honor c_int

Jerry Fleming jerry.fleming at saybot.com
Tue Mar 18 02:12:12 EDT 2008


Gabriel Genellina wrote:
> On 17 mar, 23:57, Jerry Fleming <jerry.flem... at saybot.com> wrote:
> 
>> I have a binary file written with c structures. Each record contains a
>> null-terminated string followed by two 4-bytes integers. I wrote a small
>> segment of python code to parse this file in this way:
>> [coe]
>> #!/usr/bin/python
>>
>> from ctypes import *
>>
>> class Entry(Structure):
>>         _fields_ = ('w', c_char_p), ('s', c_uint, 32), ('l', c_uint, 32)
>>
>> idx = open('x.idx', 'rb')
>> str = idx.read(1000)
>> obj = Entry(str)
>> print obj.w
>> print obj.s
>> print obj.l
>> [/code]
>> where the field w is the string, and s and l are the integers. Problem
>> is that, I can only get the strings, not the integers. Well, I did got
>> integers, but they are all zeros. What should I do to get the real numbers?
> 
> So the string has a variable length? For "Hello" you have
> 'h','e','l','l','o', a zero byte, followed by the two integers? This
> is somewhat unusual for a C struct (in fact you can't declare it in
> C). Perhaps the string is actually a char[n] array with a declared
> maximum size?

Yes, it has a variable length. The C version of the structure is 
something like this:
[code]
struct entry {
     char *str,
     int start,
     int length
}
[/code]
And adding repr() would print something like this:
[code]
'(as) mad as a 
hatter\x00\x00\x00\x00\x00\x00\x00\x00\x1f-ish\x00\x00\x00\x00\x1f\x00\x00\x00 at -ism\x00\x00\x00\x00_\x00\x00\x00B-ist\x00\x00\x00\x00\xa1\x00\x00\x00J.AU\x00\x00\x00\x00\xeb\x00\x00\x00P.EXE\x00\x00\x00\x01;\x00\x00\x00`.GIF\x00\x00\x00'
(as) mad as a hatter
0
0
[/code]
where the first line is the result of repr(). We can find that, after 
the null-terminated string '(as) mad as a hatter', there are two 
integers, 0 and 31 (0x1f). But python treat 31 as zero.

> 
> Try printing repr(a_few_read_bytes) or a_few_read_bytes.encode("hex")
> to see the actual file contents.
> 
> --
> Gabriel Genellina



More information about the Python-list mailing list