我实际上对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?
确实,我想知道如何[A, count] = fread(fid, 3,
'uint32');在Python中复制,io.readline()就像拉文件的前3个字符一样。抱歉,如果我在此处缺少要点。只是io.readline(3)在文件上使用似乎会返回它不应该返回的内容,而且block_length当它可能很长时,我不知道该如何将其容纳在单个字节中。
感谢您阅读本文。希望您能理解我想知道的内容!(任何见解都值得赞赏。)