我对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
可以适合一个字节,即使它可能非常长。
感谢您阅读我的废话。希望您能理解我要知道的内容!(任何见解都将不胜感激。)