新手求助 Python 数据格式转换的问题。

2018-08-17 10:22:50 +08:00
cqcsdzmt  cqcsdzmt
新手求助 python 数据格式转换的问题。
最近写一个自己用的上位机脚本,如下:
xxxx 省略
str = "this is udp client data\n"
socket.sendto(str, self.addr)
xxxx 省略
现在需要在 str 前面加上十六进制包头,包头如下:
flag 4 个字节 内容为 0xad 0x0e 0xfd 0x23
str 数据长度 两个字节表示
类型 4 个字节 0x00 0x00 0x00 0x01
预留 4 个字节 0x00 0x00 0x00

请问需要这么组装啊,试了一上午都没有成功
2265 次点击
所在节点   Python  Python
12 条回复
cqcsdzmt
cqcsdzmt
2018-08-17 10:24:36 +08:00
另外,如果接收同样带包头的数据,怎么把包头单独掐出来挨个解析呢?
codechaser
codechaser
2018-08-17 11:48:01 +08:00
是要把这个包转换成 str 加到字符串前面?
ebingtel
ebingtel
2018-08-17 11:52:32 +08:00
struct 试试?
anjianshi
anjianshi
2018-08-17 12:59:59 +08:00
content = "this is udp client data\n"

flag = b'\xad\x0e\xfd\x23'

hex_t = hex(len(content))[2:].zfill(4)
len_hex = chr(int(hex_t[:2], 16)) + chr(int(hex_t[2:4], 16))
len_hex = len_hex.encode()

type_ = b'\x00\x00\x00\x01'
rest = b'\x00\x00\x00\x00'

result = flag + len_hex + type_ + rest + content.encode()
print(result)
anjianshi
anjianshi
2018-08-17 13:00:39 +08:00
@cqcsdzmt 把 str 转换成 bytes,然后在前面拼接其他 bytes 就行了。上面这个是 Python 3 代码
HelloAmadeus
HelloAmadeus
2018-08-17 13:01:17 +08:00
struct 模块了解一下,这是 Python2 吗,str 竟然可以直接发送
a132811
a132811
2018-08-17 13:59:36 +08:00
用 Python3 bytes 就解决问题了。更复杂的转换,用 struct。https://ahuigo.github.io/#/post/py/py-str-struct.md
cqcsdzmt
cqcsdzmt
2018-08-17 14:24:22 +08:00
@anjianshi 非常谢谢你,我用的是 python2.7 也是可以用的吧?我去试一下
cqcsdzmt
cqcsdzmt
2018-08-17 14:24:37 +08:00
@HelloAmadeus 对,Python2
cqcsdzmt
cqcsdzmt
2018-08-17 14:25:10 +08:00
@a132811 我是 Python2.7 哦
cqcsdzmt
cqcsdzmt
2018-08-17 14:29:33 +08:00
@codechaser 不一定非要转换成 str,只在发送时在前面加上包头就可以
a132811
a132811
2018-08-17 14:42:07 +08:00
不是年久失修的老破烂项目,就装 python3 吧,又不困难。python2 这些恶心的字符问题,我才不想面对呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/480637

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX