[英]Calling from_buffer_copy in the constructor of inherited ctypes.Structure class
[英]How do I get back original buffer from a ctypes.Structure?
msg
是使用额外的字节创建的,即超过sizeof(Message)
from ctypes import *
class Message(Structure):
_fields_ = [("length", c_ushort),
("version", c_ubyte),
("type", c_ubyte),
("index", c_int),
("flags", c_int),
]
msg = Message.from_buffer(bytearray.fromhex('1000 05 06 01000000 deadbeef cccccccc'))
但是, bytes(msg)
只返回sizeof(Message)
字节。
>>> bytes(msg).hex()
'1000050601000000deadbeef'
如何从msg
检索原始字节数组? 我是否需要制作更详尽的Message
class 来覆盖__bytes__
、 from_buffer
等?
看起来“消息”是一个 header,总length
是 header 大小加上 header 之后的变量数据。定义 header,然后创建一个工厂 function,它动态地创建一个具有适当数组的结构 8818530080658尺寸:
from ctypes import *
class Header(Structure):
_fields_ = [("length", c_ushort),
("version", c_ubyte),
("type", c_ubyte),
("index", c_int),
("flags", c_int)]
def make_msg(hexstring):
buf = bytearray.fromhex(hexstring)
datalen = len(buf) - sizeof(Header)
class Message(Structure):
_fields_ = [("header", Header),
("data", c_char * datalen)]
return Message.from_buffer(buf)
msg = make_msg('1000 05 06 01000000 deadbeef cccccccc')
print(msg.header.length)
print(msg.data)
Output:
16
b'\xcc\xcc\xcc\xcc'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.