Преобразование целочисленного шестнадцатеричного формата в строки - PullRequest
0 голосов
/ 31 августа 2010

Я программирую приложение для отправки данных с использованием сокетов UDP с Python 3.1.

Команде 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))

,но это не работает.

Есть идеи, как это можно сделать?

С уважением

1 Ответ

1 голос
/ 31 августа 2010

Вам нужно сериализовать свой класс, используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...