解包结构二进制文件为uint16问题,python读取的数字比预期的要少

2024-09-28 03:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我有一个二进制文件,我正在用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中的plot看起来与matlab中的完全相同,只是每一行开始的时间早于200个点,因此在每一行的末尾都有一个新行的开始。令人惊讶的是,即使二进制数据长度与数组中元素的数量一致,数据也不会结束。我已经花了几天时间想弄清楚,请帮忙!在


Tags: inforlen二进制rangeprintchannelsmatlab
1条回答
网友
1楼 · 发布于 2024-09-28 03:20:44

您正在增加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)只返回两个字节,但是有许多缓冲区会阻止您每次调用实际访问一次文件系统。在

相关问题 更多 >

    热门问题