解码十六进制(?)数据包
我在使用Python的rtmplib库时遇到了一些问题。
首先,我有这样的代码:
import librtmp
conn = librtmp.RTMP(...)
conn.connect()
while True:
packet = conn.read_packet().body
print packet
这段代码会打印出一些数据包,像下面这样:
对我来说,这看起来像是十六进制的表示,当我把它写入文件时,会得到一些4个字符的字符串,像这样:
0200 086f 6e42 5744 6f6e 6500 0000 0000
0000 0000 0500 0000 0000 0000 0000 0200
066e 6f74 6963 6500 0000 0000 0000 0000
0502 0003 2a2a 2a02 000a 5072 6f63 6573
所以我的问题是,怎么才能把这些转换成真正的字符串(或者说是可读的文本)呢?我试过不同的方法来解码十六进制,但结果总是会出现像"\x05"这样的内容。
另外值得一提的是,写入的内容里面有很多00。
有没有人知道怎么能简单又有效地实现我之前提到的目标呢?
提前谢谢大家。
2 个回答
1
如果你不知道自己会得到什么数据,那就把这些数据保存到一个文件里,然后用查看器看看里面的内容,比如在Linux上可以用od命令。
另外,如果你不清楚会收到什么数据,可以试着在网上找找关于rtmp格式的描述。像red5这样的东西应该有相关的文档。结果果然找到了文档,链接在这里:http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf
如果你知道自己会得到什么数据,可以使用Python内置的struct库来解包这些数据,具体可以参考这个链接:https://docs.python.org/2/library/struct.html
不过我有点惊讶的是,librtmp并没有给你更高级的解析对象。你肯定不是第一个想这样做的人,所以可以看看有没有其他人提供的库来处理这个问题。
0
解决方案是 librtmp.amf.decode_amf
。
import librtmp
conn = librtmp.RTMP(...)
conn.connect()
while True:
packet = conn.read_packet().body
print packet
print librtmp.amf.decode_amf(packet)
这个是由负责管理 Python 的 librtmp 包的人提出来的。