序列化ctype联合 [英] Serializing ctype union
问题描述
是否有一种方法可以序列化ctype联合以便通过套接字发送它们?我正在尝试通过套接字将联合发送到网络服务器,但是我无法序列化数据,而是将其作为联合对象的实例发送.是否可以使用Python Struct()库执行此操作(我不认为它支持联合)?任何帮助深表感谢!
Is there a way to serialized ctype unions in order to send them over sockets? I’m trying to send a union over sockets to a network server but I am unable to serialize the data and it instead sends as an instance of the union object. Is it possible to use Python Struct() library to do this (I don’t believe it supports unions)? Any help is much appreciated!
推荐答案
如果在 ctypes.Structure
或 ctypes.Union <上调用
bytes()
/code>,您将获得可以通过套接字传输的基础字节字符串.收到后,将该字节字符串复制回原始对象.
If you call bytes()
on your ctypes.Structure
or ctypes.Union
, you will get the underlying byte string that can be transmitted over a socket. On receipt, copy that byte string back into the original object.
这是一个独立的例子.套接字服务器作为线程启动,并将向客户端发送两个对象.然后,客户端接收该对象并对其进行解释:
Here's a self-contained example. The socket server is started as a thread and will send two objects to a client. The client then receives the object and interprets it:
import ctypes
import socket
import threading
# Used to indicate what type of field is in the Union.
U32 = 1
DBL = 2
class MyUnion(ctypes.Union):
_fields_ = ('u32',ctypes.c_uint32),('dbl',ctypes.c_double)
class MyStruct(ctypes.Structure):
_pack_ = 1 # define before _fields_ to have an affect.
_fields_ = ('type',ctypes.c_int),('u',MyUnion)
def client():
s = socket.socket()
s.connect(('localhost',5000))
# Wrap the socket in a file-like object so an exact amount of bytes can be read.
r = s.makefile('rb')
# Read two structures from the socket.
ex1 = MyStruct.from_buffer_copy(r.read(ctypes.sizeof(MyStruct)))
ex2 = MyStruct.from_buffer_copy(r.read(ctypes.sizeof(MyStruct)))
s.close()
# display the correct Union field by type.
for ex in (ex1,ex2):
if ex.type == U32:
print(ex.u.u32)
else:
print(ex.u.dbl)
def server():
s = socket.socket()
s.bind(('',5000))
s.listen(1)
c,a = s.accept()
# Prepare two structures
ex1 = MyStruct()
ex1.type = DBL
ex1.u.dbl = 1.234
ex2 = MyStruct()
ex2.type = U32
ex2.u.u32 = 1234
# Send them as bytes
c.sendall(bytes(ex1))
c.sendall(bytes(ex2))
c.close()
s.close()
# spin off the server in a thread so the client can connect to it.
t = threading.Thread(target=server)
t.start()
client()
输出:
1.234
1234
这篇关于序列化ctype联合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!