我的C程序中有以下结构:
typedef struct
{
void* str;
DWORD str_length;
DWORD count;
} mystruct;
我想在Python中创建一个缓冲区,将其写入文件,然后从我的C程序中读取它,并将此缓冲区引用为“mystruct”。
我在python中尝试的是:
from struct import *
str = raw_input("str: ")
count = raw_input("count: ")
s = Struct ( str(len(str)) + 'sLL' )
s.pack( str , len(str) , int(count))
它返回二进制缓冲区,但不返回我的数据。
我哪弄错了?有更好的方法吗?
答案 0 :(得分:0)
我更喜欢使用ctypes来完成这类工作。它为处理指针提供了更多选择。下面是一个使用ctypes解决问题的示例(在Python 3.x中,但您可以轻松地将其转换为Python 2.x)。 您的结构仍然不包含数据。只有指向可从C代码访问的缓冲区的指针。这个缓冲区是使用create_string_buffer创建的,它将python字符串转换为C null终止字符串。
from ctypes import *
class mystruct(Structure):
_fields_ = [("str", c_char_p),
("str_length", c_long),
("count", c_long)]
s = b"ABC" * 10
c = 44
#convert python string to null terminated c char array
c_str = create_string_buffer(s)
#cast char array to char*
c_str_pointer = cast(c_str, c_char_p)
#create structure
a = mystruct(c_str_pointer, len(s), c)
# print byte representation of structure
print(bytes(a))
print(a.str)
print(a.str_length)
print(a.count)
如果您不需要指针并且常量缓冲区足够,您也可以使用ctypes
执行此操作from ctypes import *
class mystruct(Structure):
_fields_ = [("str", c_char*100),
("str_length", c_long),
("count", c_long)]
s = b"ABC" * 10
c = 44
a = mystruct(s, len(s), c)
# print byte representation of structure
print(bytes(a))
print(a.str)
print(a.str_length)
print(a.count)