1

我的 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))

它返回一个二进制缓冲区,但不是我的数据。

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

4

1 回答 1

0

我更喜欢使用 ctypes 来完成这种工作。它提供了更多处理指针的选项。这是一个如何使用 ctypes 解决您的问题的示例(在 Python 3.x 中,但您可以轻松地将其转换为 Python 2.x)。您的结构仍然不包含数据。仅指向可从 C 代码访问的缓冲区的指针。这个缓冲区是使用 create_string_buffer 创建的,它将 python 字符串转换为 C 空终止的字符串。

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)
于 2013-05-01T13:49:43.727 回答