如何提取嵌入在zip文件中的ieee-be二进制文件?

0 投票
3 回答
2039 浏览
提问于 2025-04-15 15:24

我有一堆压缩文件,里面包含了几个用 ieee-be 编码的二进制文件和文本文件。我使用了 Python 的 ZipFile 模块,可以提取文本文件的内容。

def readPropFile(myZipFile):
    zf = zipfile.ZipFile(myZipFile,'r') # Open zip file for reading
    zFileList=zf.namelist() # extract list of files embedded in _myZipFile_

    # text files in _myZipFile_ contain the word 'properties' so 
    # get a list of the property files here
    for f in zFileList:
        if f.find('properties')>0:
            propFileList.append(f)

    # open first file in propFileList
    pp2 = cStringIO.StringIO(zf.read(propFileList[0])) 
    fileLines = []
    for ll in pp2:
        fileLines.append(ll)

    # return the lines in the property text file
    return fileLines 

现在我想做类似的事情,不过是读取二进制文件中的数据,并创建一个浮点数的数组。我该怎么做呢?

更新 1

这些二进制文件的格式是这样的,在 MATLAB 中,我提取到一个临时位置后,可以用以下方式读取它们。

>>fid=fopen('dataFile.bin','r','ieee-be');
>>dat=fread(fid,[1 inf],'float');

更新 2

我现在有一个简单的函数,试图读取二进制数据,代码大概是这样的:

def readBinaryFile(myZipFile):
    zFile = zipfile.ZipFile(myZipFile,'r')
    dataFileName = 'dataFile.bin'
    stringData = zFile.read(dataFileName)
    ss=stringData[0:4]
    data=struct.unpack('>f',ss) 

但是我得到的值和在 MATLAB 中报告的值是一样的。

更新 3

我二进制文件中的第一个浮点数:

  • 十六进制值:BD 98 99 3D
  • 浮点数:-.07451103

3 个回答

1

在问题中的代码片段里,“属性文件”(这是什么我也不太清楚)是通过检查文件内容中是否有字符串'properties'来判断的,这种方式比较宽松。当把文件当作文本读取时就能发现这个字符串。不过,我不太清楚对于二进制的IEEE-le文件来说,应该怎么做。

不过,使用Python,有一个简单的方法可以读取IEEE-le(或其他格式)的文件,那就是使用SciPy的io.fopen模块。

编辑
因为读取这样的二进制文件本来就需要知道文件的结构,所以你可以用struct.pack()的格式来表示,就像Michael Dillon的回答中提到的那样!这只需要使用标准库,操作起来也很简单!

2

你也可以试试Numpy这个扩展(在这里),它比SciPy要轻便一些。Numpy有很多输入输出的功能。例如,

import numpy
f = file ('example.dat')
data_type = numpy.dtype ('float32').newbyteorder ('>')
x = numpy.fromfile (f, dtype=data_type)

这段代码会给你一个numpy数组。可能还有更简单的方法来指定数据类型。

2

你需要的大部分信息都在这个回答里,链接是如何在Python 2.5中将浮点数转换为十六进制字符串?附带了不工作的解决方案

可以看看关于struct.pack的内容。

关于struct的更多细节可以在Python文档中找到。

撰写回答