如何将字符串的长度转换为字节?

时间:2014-05-01 17:47:16

标签: python python-2.7

我正在尝试让客户端连接到运行erlang的聊天服务器,它将所有内容解析为字节。我可以成功连接到服务器。

然而,服务器管理员一直告诉我,我的格式错误。我觉得我终于把事情搞定了,但我遇到了一个不同寻常的问题;当我试图转换消息内容的长度时,它出现了可怕的错误(我得到的最接近的是十六进制,它仍然是“31”,超过30个字符太长了)。

这是我的代码:

import socket
import struct
import binascii
host = 'jimmyr.com'    # The remote host
port = 12345              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send('\x00\x01\x00\x00\x00\x04Omio') # This works.
data = s.recv(1024)
print repr(data)+"\n" # From server, I get '\x00\x01\x00\x0eYou connected!'
message = raw_input("Message to send at chat [!!! to quit]")
mlength = str(len(message))
print repr(data)+"\n"
while str(message) != "!!!":
    if str(message) != "":
        s.send('\x00\x01\x00\x01'+(str(len(message)).encode("hex")+str(message).encode("hex")))
        message = raw_input("Message to send to chat [!!! to quit]")
        data = s.recv(1024)
        print repr(data)+"\n"
    else:
    print repr(data)+"\n"
#EoF

就我需要做出的回应而言,请参阅the server's protocol specification

1 个答案:

答案 0 :(得分:2)

我认为你误解了规范中十六进制表示的含义。规范使用十六进制来显示二进制值。关键是Everything non-text will be 2 byte long。因此,您的消息长度需要编码为双字节(大端)二进制值。您不希望您的字符串也以十六进制编码,而是将其作为普通字节串发送。

我想你想send这个:

struct.pack(">HHH", 1, 1, len(message)) + message

这使用struct.pack来处理“服务器ID”和“数据包代码”数以及长度,这应该比需要手动编码其他位更好。 >代码意味着使用big-endian编码,而三个H代表打包三个“unsigned short”(双字节)整数。