2010-08-31 144 views
0

我正在編程一個應用程序,使用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

修復你的代碼格式和發佈您的實際類 – 2010-08-31 13:54:26

回答

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 
+0

你好尼克, 感謝您的回答。但是,我發現要用套接字(Blah)發送的字節字符串不僅包含變量mynum和mystr的值,還包含其他內容,如上所示。我可以發送的只是結構中變量的值。 – Joan 2010-09-01 08:02:34

相關問題