将bytearray反向移植到Python 2.5

时间:2015-11-26 21:31:17

标签: python python-3.x byte bytearray python-2.5

我正在尝试转换this websocket示例以便在Python 2.5中使用,但是使用bytearray类型会遇到错误。

代码在此处停止为Python 2.5工作(在websocket_server/websocket_server.py的send_text方法中):

    FIN    = 0x80
    OPCODE = 0x0f
    def send_text(self, message):
       header = bytearray();
       payload = encode_to_UTF8(message)
       payload_length = len(payload)
       header.append(FIN | OPCODE_TEXT)
       header.append(payload_length)

       self.request.send(header + payload)

消息变量存储发送给客户端的字符串输入。

它尝试创建一个字节数组并使用self.request.send方法发送它。我如何更改它以使其在没有字节类型或bytearray的Python 2.5中工作?

1 个答案:

答案 0 :(得分:1)

使用struct MIGHT工作,我还没有对此进行测试。

作为一种解决方法,我会做的是使用struct.pack逐字节打包。

mensaje = "saludo"
FIN    = 0x80
OPCODE = 0x0f
payload = ''
for c in mensaje:
    payload += struct.pack("H", ord(c))

msj = struct.pack("H",FIN | OPCODE )
msj+= struct.pack("H",len(payload))
print msj + payload

我正在使用" H"作为' fmt' struct.pack函数中的参数,但是你最好检查你的包是如何发送的,以及每个字符的字节数是多少。 (因为我猜测你正在使用unicode,我使用' H&#39 ;,无符号短= 2字节)。

更多信息:https://docs.python.org/2/library/struct.html,第7.3.2.1节和第7.3.2.2节。

编辑: 我在这里回答,使用' chr()'是什么意思?而不是' struct.pack()':

mensaje = "saludo"
FIN    = 0x80
OPCODE = 0x0f
payload = mensaje
msj = chr( FIN | OPCODE )
msj+= chr(len(payload))
print msj + payload

如果你打印消息,那么你在使用struct.pack("B", ord(something))时应该看到与使用ord(something)时相同的输出,我只使用了struct.pack()因为我认为你的消息是每个字符两个字节(作为unicode)。