struct.unpack二进制文件为uint16问题,python读取的数字少于预期

时间:2015-08-03 19:44:08

标签: python matlab python-2.7 data-structures binary

好的,所以我有二进制文件,我正在用python阅读,我用matlab检查结果。

#Constants
RecordsPerBuffer = 10
RecordLength = 9920
Records = 1000
Channels = 2

SamplesPerAline = Channels*RecordLength*RecordsPerBuffer
AlinesPerBscan = Records/RecordsPerBuffer
onearm='RawSpectraBgn.dat'
with open(onearm, "rb") as f:
    fileContent = f.read()
    print(type(fileContent)), "FileContentType"
    print(len(fileContent)), "FileContentLenght", len(fileContent)*1./10
    for j in range (0, AlinesPerBscan):
        for i in range (0, SamplesPerAline):
                back[i,j]=struct.unpack_from('!H',fileContent[(j*SamplesPerAline+i*2):(j*SamplesPerAline+i*2+2)])[0]
        #print back.shape

所以我有一个包含AlinesPerBscan行和AlinesPerBscan列的数组,我在python和matlab中绘制行。虽然在matlab中每一行看起来都是一样的,但在python中看起来与matlab完全相同,除了事实上每行早于2点开始并提前结束,所以每行末尾都有一个新行的开头。令人惊讶的是,即使二进制数据长度与数组中的元素数量一致,数据也不会结束。我花了几天时间试图解决这个问题,请帮忙!

1 个答案:

答案 0 :(得分:1)

您正在将j增加记录数,而不是这些记录的总大小。假设性能不是问题,那么根据需要读取两个字节而不是尝试自己模拟文件指针会更清楚。

with open(onearm, "rb") as f:
    fileContent = f.read()
    print(type(fileContent)), "FileContentType"
    print(len(fileContent)), "FileContentLenght", len(fileContent)*1./10
    for j in range (0, AlinesPerBscan):
        for i in range (0, SamplesPerAline):
            back[i,j] = struct.unpack("!H", f.read(2))[0]

虽然f.read(2)只返回两个字节,但是涉及许多缓冲区,阻止您在每次调用时实际访问文件系统一次。