如何在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数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中解压嵌套的 DBRef?

使用Python SDK时如何防止GCS自动解压对象?

如何在python中解压12个字节? php代码可用!试图将其转换为 python

如何解压pkl文件?

如何在node js中解压二进制数据

如何在 PHP 中解压 MySQL 多点几何数据?