使用python生成二进制缓冲区,以在C中作为结构读取

使用python生成二进制缓冲区,以在C中作为结构读取,python,c,Python,C,我的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

我的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))
它返回一个二进制缓冲区,但不返回我的数据


我哪里弄错了?有更好的方法吗?

我更喜欢用ctypes做这种工作。它提供了更多处理指针的选项。下面是一个使用ctypes解决问题的示例(在Python3.x中,但您可以轻松地将其转换为Python2.x)。 您的结构仍然不包含数据。只有指向缓冲区的指针可以从C代码访问。此缓冲区是使用create_string_缓冲区创建的,该缓冲区将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)

结构不包含字符串的空间!因此我建议声明为
struct{char str[120];DWORD str_length,count;}
。绳子的长度应该根据你的需要来调整。TrueY是对的。阅读文档()。要打包“void*”,应使用“P”,而不是“s”。但是,既然你想要一个字符串,你应该改变C结构,就像他告诉你的那样。你当然是对的,但我的问题是在我尝试用C读取它之前。python中的pack()输出似乎并不反映我的数据。