85
社区成员




需要发送的tcp消息头都是16进制的,但是写\x什么的形式发消息时,因为\的特殊性,发的消息和显示、print的内容不那么一样,有许多带\的显示出来都变了,比如\x36显示的是b'6,把\x3显示成别的了
后来虽然查资料发现它显示得不一样,只是显示在屏幕上不一样,实际上传值是没错的(\x36这种的,虽然显示是'6,但是传的确实是\x36,用==比较过是true的),服务端也能识别正确,但是显示得不一样很影响debug,有时显示给转义转得连显示的消息位数都变了,非常影响debug还得手动数,查了好多试了好多都没找到办法怎么能让它输出带\的内容
还有,tcp发消息那么麻烦吗?因为发出去的必须得是byte,写段消息头,数据类型得来回转许多许多次,多的时候一行能嵌套三层括号
比如,有个消息段要这么发送:消息号(flag)是1,消息长度是4bytes,不够4bytes要补位到4bytes,而且是小段序,也就是1要转成\x01\x00\x00\x00,并且是byte,才能发出去,我弄半天写出来了
msg_id = struct.pack('<i', int(hex(msg_flag)[2:].zfill(4), 16))
感觉太麻烦了,接触python没多久,有简单写法吗?
对于你的第一个问题,关于在Python中使用\x形式表示16进制字符时,显示和实际传输的问题,Python中的字符串在显示时确实会对特殊字符进行转义显示,但实际传输的内容是正确的。如果你希望输出带有\x的内容,可以使用原始字符串(raw string)来避免转义。在字符串前面加上'r'即可创建一个原始字符串。
例如:
s = r"\x36"
print(s) # 这里将会输出\x36
至于你的第二个问题,关于TCP发送消息的麻烦程度和你提到的消息头转换的复杂性,Python提供了许多库和工具来简化TCP通信和数据转换的过程。你可以考虑使用socket库来简化TCP通信的实现,以及使用struct库来简化数据类型转换。
例如,你可以使用以下代码来发送消息号(flag)为1,消息长度为4字节的消息:
import socket
import struct
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('服务器地址', 端口号))
msg_flag = 1
msg_length = 4
msg_id = struct.pack('<i', msg_flag)
msg_len = struct.pack('<i', msg_length)
client_socket.send(msg_id + msg_len)
client_socket.close()
这样,你可以通过struct库来简化数据类型的转换,通过socket库来简化TCP通信的实现。
字符串前缀r或R可以告诉解释器原样输出字符串:
print(r'\x36')