Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我对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));
感谢您阅读本文。希望您能理解我想知道的内容! (任何见解都值得赞赏。) 回答: 从fread的文档中 ,它是读取二进制数据的功能。第二个参数指定输出向量的大小,第三个参数指定读取的项的大小/类型。 为了在Python中重新创建它,可以使用array模块: f = open(...) import array a = array.array("L") # L is the typecode for uint32 a.fromfile(f, 3) 这将会读取读取从文件中的三个UINT32值f ,这是在提供a之后。从fromfile的文档中: 从文件对象f中读取n项(作为机器值)并将其附加到数组的末尾。如果少于n个可用项目,则会引发EOFError,但可用项目仍将插入到数组中。 f必须是真正的内置文件对象;使用read()方法可以完成其他任务。数组实现序列协议,因此支持与列表相同的操作,但是您也可以使用.tolist()方法从数组创建普通列表。 更多&回答... |
![]() |
![]() |