加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python二进制数据读取

发布时间:2020-12-20 13:03:37 所属栏目:Python 来源:网络整理
导读:urllib2请求接收二进制响应,如下所示: 00 00 00 01 00 04 41 4D 54 44 00 00 00 00 02 4197 33 33 41 99 5C 29 41 90 3D 71 41 91 D7 0A 470F C6 14 00 00 01 16 6A E0 68 80 41 93 B4 05 4197 1E B8 41 90 7A E1 41 96 8F 57 46 E6 2E 80 0000 01 16 7A 53
urllib2请求接收二进制响应,如下所示:

00 00 00 01 00 04 41 4D 54 44 00 00 00 00 02 41
97 33 33 41 99 5C 29 41 90 3D 71 41 91 D7 0A 47
0F C6 14 00 00 01 16 6A E0 68 80 41 93 B4 05 41
97 1E B8 41 90 7A E1 41 96 8F 57 46 E6 2E 80 00
00 01 16 7A 53 7C 80 FF FF

其结构是:

DATA,TYPE,DESCRIPTION

00 00 00 01,4 bytes,Symbol Count =1

00 04,2 bytes,Symbol Length = 4

41 4D 54 44,6 bytes,Symbol = AMTD

00,1 byte,Error code = 0 (OK)

00 00 00 02,Bar Count =  2

FIRST BAR

41 97 33 33,Close = 18.90

41 99 5C 29,High = 19.17

41 90 3D 71,Low = 18.03

41 91 D7 0A,Open = 18.23

47 0F C6 14,Volume = 3,680,608

00 00 01 16 6A E0 68 80,8 bytes,Timestamp = November 23,2007

SECOND BAR

41 93 B4 05,Close = 18.4629

41 97 1E B8,High = 18.89

41 90 7A E1,Low = 18.06

41 96 8F 57,Open = 18.82

46 E6 2E 80,Volume = 2,946,325

00 00 01 16 7A 53 7C 80,Timestamp = November 26,2007

TERMINATOR

FF FF,

如何读取这样的二进制数据?

提前致谢.

更新:

我用前面的代码在前6个字节上尝试了struct module:

struct.unpack('ih',response.read(6))

(16777216,1024)

但它应该输出(1,4).我看一下手册,但不知道出了什么问题.

解决方法

>>> data
'x00x00x00x01x00x04AMTDx00x00x00x00x02Ax9733Ax99)Ax90=qAx91xd7nGx0fxc6x14x00x00x01x16jxe0hx80Ax93xb4x05Ax97x1exb8Ax90zxe1Ax96x8fWFxe6.x80x00x00x01x16zS|x80xffxff'
>>> from struct import unpack,calcsize
>>> scount,slength = unpack("!IH",data[:6])
>>> assert scount == 1
>>> symbol,error_code = unpack("!%dsb" % slength,data[6:6+slength+1])
>>> assert error_code == 0
>>> symbol
'AMTD'
>>> bar_count = unpack("!I",data[6+slength+1:6+slength+1+4])
>>> bar_count
(2,)
>>> bar_format = "!5fQ"                                                         
>>> from collections import namedtuple
>>> Bar = namedtuple("Bar","Close High Low Open Volume Timestamp")             
>>> b = Bar(*unpack(bar_format,data[6+slength+1+4:6+slength+1+4+calcsize(bar_format)]))
>>> b
Bar(Close=18.899999618530273,High=19.170000076293945,Low=18.030000686645508,Open=18.229999542236328,Volume=36806.078125,Timestamp=1195794000000L)
>>> import time
>>> time.ctime(b.Timestamp//1000)
'Fri Nov 23 08:00:00 2007'
>>> int(b.Volume*100 + 0.5)
3680608

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读