有没有办法让pycharm直接在debug时显示或print出诸如\x3这样的特殊字符?

爱听歌丶的小圆点 2024-03-23 23:46:54

需要发送的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没多久,有简单写法吗?

...全文
186 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
瞎了眼的枸杞 2024-03-24
  • 打赏
  • 举报
回复

对于你的第一个问题,关于在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

创建一个TCP连接

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('服务器地址', 端口号))

准备要发送的消息号和消息长度

msg_flag = 1
msg_length = 4

将消息号转换为小端序的4字节byte

msg_id = struct.pack('<i', msg_flag)

将消息长度转换为小端序的4字节byte

msg_len = struct.pack('<i', msg_length)

发送消息号和消息长度

client_socket.send(msg_id + msg_len)

关闭连接

client_socket.close()
这样,你可以通过struct库来简化数据类型的转换,通过socket库来简化TCP通信的实现。

太空漫步11 2024-03-24
  • 打赏
  • 举报
回复

字符串前缀r或R可以告诉解释器原样输出字符串:

print(r'\x36')


85

社区成员

发帖
与我相关
我的任务
社区描述
社区服务大学生和社会自学编程的人士,欢迎知识,经验丰富的专业人士加入。
社区管理员
  • 扶苏怎么会服输
  • 活君儿
  • 迪迪迪迪.
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

社区内不允许出现敏感词汇;

社区内部可以随意发表问题,代码bug;

非特殊说明,不允许擅自发布他人隐私和不雅内容。

试试用AI创作助手写篇文章吧