Я практически не знаю 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
может вписываться в один байт, когда он может быть очень длинным.
Спасибо, что прочитал этот болтовню. Надеюсь, вы можете понять, что я хочу знать! (Любое понимание вообще ценится.)