首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按字节读取二进制数据并使用python提取数据

按字节读取二进制数据并使用python提取数据
EN

Stack Overflow用户
提问于 2018-06-26 14:20:58
回答 1查看 699关注 0票数 0

我有一个文件,内容如下:

代码语言:javascript
复制
 0:   10 51 03 37 7F 43 82 99  45 3F E7 35 3A A8 80 B9   .text ? etc  # text 
10:   3D 3F F4 49 F8 9A 7A 85  03 40 8A C8 46 DE 0A 1A   . -@ =! ETC  # text 
30:   .......................................................
40:   ...........................................10 03

     Repeat next instant 
     10 51 ................................................................
     ............................................ 10 03

这是一条消息,其中10和51表示特定消息的开始,而10 03表示消息的结束。10表示0字节位置,51表示1字节位置并继续。

我的目标是读取5-8字节的位置十六进制数据,并转换为浮点型和9-16位字节为双倍的每一时刻

到目前为止,我的实现只读取前31个十六进制数据。

代码语言:javascript
复制
 import struct

with open("RawData.log",'rb') as fin:
    data1 = ["{:02x}".format(ord(c)) for c in fin.read()]
    data2=''.join(data1)

    #data=pd.DataFrame({'test':data1})
    header = "51"
    tail   = "03"


   # header_index = data2.index(header)
    header_index=[i for i, s in enumerate(data1) if header in s]
    footer_index = [i for i, s in enumerate(data1) if tail  in s]
    if header_index >= 0 and footer_index >= header_index:
       body = data2[10:18]
       print struct.unpack('!f',body.decode('hex'))[0]

       #261.197418213 only 1 output not iterating for whole file. Similarly how to extract 9 to 16 byte position data to double for entire file.

如何读取整个文件并从十六进制数据中仅提取这两个字段( 10和51)

EN

回答 1

Stack Overflow用户

发布于 2018-06-28 04:15:10

这是一种提取分隔符之间的数据并从文件中每个消息的前12个位置解压浮点数和双精度数的简单方法:

代码语言:javascript
复制
with open('RawData.log', 'rb') as f:  # read data in binary format
    bs = f.read()
prev = None
start = None
end = None
for i, b in enumerate(bs):
    if prev == b'\x10' and b == b'\x51':
        # match beginning of message
        start = i + 1 
    if prev == b'\x10' and b == b'\x03':
        # match end of message
        end = i - 1 
    if start and end:
        data = bs[start:end]
        fmt = '!fd'   # unpack a float and double, big-endian
        flt, dble = struct.unpack(fmt, data[:12])
        print flt, dble
        # reset delimiter positions
        start = None
        end = None
    prev = b 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51036090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档