将bytearray向后移植到Python 2.5
我试图将websocket示例转换为在Python2.5中使用,但在使用bytearray类型时遇到了错误 代码在此处停止用于Python 2.5(在的send_text方法中): message变量存储发送给客户端的字符串输入将bytearray向后移植到Python 2.5,python,python-3.x,byte,bytearray,python-2.5,Python,Python 3.x,Byte,Bytearray,Python 2.5,我试图将websocket示例转换为在Python2.5中使用,但在使用bytearray类型时遇到了错误 代码在此处停止用于Python 2.5(在的send_text方法中): message变量存储发送给客户端的字符串输入 它尝试创建一个字节数组,并使用self.request.send方法发送该数组。我将如何更改它以使其在没有字节类型或bytearray的Python 2.5中工作?使用struct可能会工作,我还没有测试过这一点 作为一种解决方法,我将使用struct.pack逐个字节
它尝试创建一个字节数组,并使用self.request.send方法发送该数组。我将如何更改它以使其在没有字节类型或bytearray的Python 2.5中工作?使用struct可能会工作,我还没有测试过这一点 作为一种解决方法,我将使用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
我在struct.pack函数中使用“H”作为“fmt”参数,但您最好检查包是如何发送的,以及每个“字符”有多少字节(因为我猜您使用的是unicode,我使用的是“H”,unsigned short=2字节)
更多信息:,第7.3.2.1节和第7.3.2.2节
编辑:
我将在这里回答,使用'chr()'而不是'struct.pack()'是什么意思:
如果您打印消息,那么使用
struct.pack(“B”,ord(something))
时,您应该会看到与使用ord(something)时相同的输出。
,我只是使用struct.pack(),因为我认为您的消息是每个字符两个字节(作为unicode).使用Python 2.5而不是升级的原因是什么?我正在开发的库当前正在运行Jython 2.5.3。是的,Jython 2.5.3具有struct。然后,使用struct.pack
而不是使用bytearray来创建标头+负载。我希望通过这种方式可以创建一个二进制数据包。查看文档,语法会像struct.pack(fmt,FIN | OPCODE_TEXT,payload_length)和self.request.send(struct+payload)一样吗。对吗?fmt参数应该是什么?非常感谢!此解决方法使用fmt=“B”而不是“H”进行工作。看起来服务器现在可以发送文本了。很高兴听到这个消息。那么,您发送的是ascii字节?(B是一个字符,在这种情况下,您可以使用ord(c)
是的,看起来我在发送ascii字节。用ord(c)替换struct是什么意思?我编辑了我的答案,可能是代码(没有struct.pack()
函数)同样有效。-->好的,它是'chr'而不是'ord'。查看上一版本。好的,据我所知,bytearray只是一个字节序列。字符串也是一个字节序列。struct.pack
所做的是以一种简单的方式将字节存储在字符串中。因此,正如您所看到的,既然所有选项都只是一个字节数组,那么它们就都可以正常工作同样。当然,在这种情况下很容易,因为我们讨论的是单字节字符,但对于unicode,我想使用os struct.pack()是必要的(这只是一种在字符串数组中打包字节的方法…与bytearray相同)。
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
mensaje = "saludo"
FIN = 0x80
OPCODE = 0x0f
payload = mensaje
msj = chr( FIN | OPCODE )
msj+= chr(len(payload))
print msj + payload