好的,所以我有二进制文件,我正在用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点开始并提前结束,所以每行末尾都有一个新行的开头。令人惊讶的是,即使二进制数据长度与数组中的元素数量一致,数据也不会结束。我花了几天时间试图解决这个问题,请帮忙!
答案 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)
只返回两个字节,但是涉及许多缓冲区,阻止您在每次调用时实际访问文件系统一次。