我正在编写一个应用程序来使用带有Python 3.1的UDP套接字发送数据。
命令socket.send
需要以字节为单位的数据。
我遇到的问题是我必须发送的包有三个不同的字段,第一个包含16位整数变量(c_ushort
),第二个字段也是如此,第三个字段是字符串其长度最多可达900个字符。
然后我决定创建一个包含这三个字段的结构:
class PHAL_msg(Structure):
_fields_ = [("Port", c_ushort),
("Size", c_ushort),
("Text", c_wchar_p)]
我希望我可以通过将其转换为字节对象来发送此对象:
Msg_TX = PHAL_msg(Port=PHAL_ADDRESS, Size=PAYLOAD_SIZE, Text='HELLO woRLD!')
socket.send(bytes(Msg_TX))
,但它不起作用。
知道如何做到这一点?
问候
答案 0 :(得分:1)
您需要序列化您的课程,使用pickle
。
class Blah:
def __init__(self,mynum, mystr):
self.mynum = mynum
self.mystr = mystr
a = Blah(3,"blahblah")
#bytes(a) # this will fail with "TypeError: 'Blah' object is not iterable"
import pickle
b = pickle.dumps(a) # turn it into a bytestring
c = pickle.loads(b) # and back to the class
print("a: ", a.__repr__(), a.mynum, a.mystr)
print("pickled....")
print("b: type is:",type(b)) # note it's already in bytes.
print(b.__repr__())
print("unpickled....")
print("c: ", c.__repr__(), c.mynum, c.mystr)
输出:
a: <__main__.Blah object at 0x00BCB470> 3 blahblah
pickled....
b: type is: <class 'bytes'>
b'\x80\x03c__main__\nBlah\nq\x00)\x81q\x01}q\x02(X\x
05\x00\x00\x00mystrq\x03X\x08\x00\x00\x00blahblahq\x
04X\x05\x00\x00\x00mynumq\x05K\x03ub.'
unpickled....
c: <__main__.Blah object at 0x00BCB950> 3 blahblah