【发布时间】:2011-01-09 21:39:26
【问题描述】:
我对 Matlab 几乎一无所知,需要将一些解析例程翻译成 Python。它们用于大文件,它们本身被分成“块”,我从文件顶部的校验和开始就遇到了困难。
Matlab 到底发生了什么?
status = fseek(fid, 0, 'cof');
fposition = ftell(fid);
disp(' ');
disp(['** Block ',num2str(iBlock),' File Position = ',int2str(fposition)]);
% ----------------- Block Start ------------------ %
[A, count] = fread(fid, 3, 'uint32');
if(count == 3)
magic_l = A(1);
magic_h = A(2);
block_length = A(3);
else
if(fposition == file_length)
disp(['** End of file OK']);
else
disp(['** Cannot read block start magic ! Note File Length = ',num2str(file_length)]);
end
ok = 0;
break;
end
fid 是当前正在查看的文件 iBlock 是您在文件中所在的“块”的计数器
magic_l 和magic_h 稍后会处理校验和,这里是代码(直接从上面的代码开始):
disp(sprintf(' Magic_L = %08X, Magic_H = %08X, Length = %i', magic_l, magic_h, block_length));
correct_magic_l = hex2dec('4D445254');
correct_magic_h = hex2dec('43494741');
if(magic_l ~= correct_magic_l | magic_h ~= correct_magic_h)
disp(['** Bad block start magic !']);
ok = 0;
return;
end
remaining_length = block_length - 3*4 - 3*4; % We read Block Header, and we expect a footer
disp(sprintf(' Remaining Block bytes = %i', remaining_length));
-
%08X和hex2dec是怎么回事? - 另外,为什么指定
3*4而不是12?
真的,我想知道如何在 Python 中复制 [A, count] = fread(fid, 3, 'uint32');,因为 io.readline() 只是提取文件的前 3 个字符。抱歉,如果我在这里的某个地方遗漏了要点。只是在文件上使用io.readline(3) 似乎返回了它不应该返回的东西,而且我不明白block_length 在可能很长的情况下如何适合单个字节。
感谢您阅读本文。我希望你能理解我想知道的那种! (任何见解都值得赞赏。)
【问题讨论】:
-
您可能想考虑拆分问题并将第二部分移动到另一个问题中,标题有点误导。
标签: python matlab numpy readline fread