如何在python中解压stxetx数据
Posted
技术标签:
【中文标题】如何在python中解压stxetx数据【英文标题】:how to unpack stxetx data in python 【发布时间】:2016-12-20 16:14:18 【问题描述】:我正在接收从 RS485 级串行总线发送到 ESeye 的数据包
Hammerkop 发送器,然后 URL 对数据进行编码并将其发送到我的服务器。请求如下所示:
at=info method=GET path="/write/?type=stxetx&packet=ArcYX%01%00%00%00%00%00%00%03%00%F0%00%06%00%F0%008%0E%B0%27%00%00%E85&localpackettime=2016-12-20+16%3A00%3A27&serial=868324023356343&packettime=2016-12-20+16%3A00%3A27&receivetime=2016-12-20+16%3A00%3A28&timezone=UTC" host=dry-hollows-46605.herokuapp.com request_id=4d5bec23-0676-4e32-ae66-af26e26f0394 fwd="81.94.198.91" dyno=web.1 connect=1ms service=232ms status=500 bytes=63266
我使用 Django 1.9 作为我的框架并获取我使用的数据包数据:
packet_data = request.GET.getlist('packet')
我收到的数据如下:
packet_data = [u"A\x90cYX\x01\x00\x00\x00\x00\x00\x00\x03\x00\xf0\x00\x06\x00\xf0\x008\x0e\xb0'\x00\x00\xe85"]
然后我必须将其拆分为字节,第一个字母是一个 ascii 字母,可以直接忽略,其余的都是字节。我正在尝试将此 unicode 字符串拆分为我需要的值,例如“A”之后的前 4 个字节是一个字节 int 时间戳。
我尝试过对值进行编码,例如:
a = packet_data[1].encode('utf-8')
b = packet_data[2].encode('utf-8')
c = packet_data[3].encode('utf-8')
d = packet_data[4].encode('utf-8')
将它们转换为 str 而不是 unicode 然后我打开它们:
timestamp = unpack('i',a+b+c+d)
但是这只在某些时候有效,有时我会收到错误:
error: unpack requires a string argument of length 4
我得到了这些时间戳值的错误,例如:
before encoding u'\x90', u'c', u'Y', u'X'
after encoding '\xc2\x90', 'c', 'Y', 'X'
这些建议会很有帮助,我已经为此研究了好几天。
我唯一的想法是我没有正确打包/解包数据,也许我错过了正确的填充,但我尝试了不同的 [填充类型,它们似乎也没有帮助。接下来有人会尝试什么?
【问题讨论】:
你为什么把它作为文本而不是字节? 对不起,你能说得更具体些吗 :-) 不,因为你没有足够具体地说明你是如何“得到”它的。 好的,谢谢我已经更新它以提供更多信息,现在有意义吗?您需要更多信息吗? 【参考方案1】:Django 将 GET 参数解码为文本而不是二进制数据,这是毫无帮助的。你需要自己解析request.META['QUERY_STRING']
的内容。
>>> import urlparse
>>> urlparse.parse_qs('...&packet=ArcYX%01%00%00%00%00%00%00%03%00%F0%00%06%00%F0%008%0E%B0%27%00%00%E85&...')['packet'][0]
"ArcYX\x01\x00\x00\x00\x00\x00\x00\x03\x00\xf0\x00\x06\x00\xf0\x008\x0e\xb0'\x00\x00\xe85"
【讨论】:
以上是关于如何在python中解压stxetx数据的主要内容,如果未能解决你的问题,请参考以下文章