matlab解析二进制结构体数据(嵌套结构体)
下边的代码有问题。因为嵌套结构体设计 对齐问题。下述代码并没有充分考虑
clear all;close all;clc;
% 定义MATLAB中的结构体以匹配C语言中的结构体
AAA = struct('x', int16(0), 'y', int16(0), 'z', int16(0), 'c', int16(0));
BBB = struct('aaa', AAA, 'it', int32(0), 'oo', int32(0), 'qwe', single(0));
% 打开二进制文件
fileID = fopen('bin', 'c');
if fileID == -1
error('无法打开文件');
end
% 计算单个结构体的大小(字节)
% 注意:int16_t是2字节,float(在MATLAB中是single)通常是4字节(取决于平台和编译选项)
% int32_t是4字节(如果MATLAB中的int不是32位,请使用int32)
structSize = 2*4 + 4 + 4 + 4; % 4个int16_t字段 + 1个int16_t字段 + 1个int32_t字段 + 1个float字段
structs = {}; % 初始化一个cell数组来存储结构体,大小设置为Inf以便动态扩展
index = 1; % 结构体索引
% 读取数据直到文件末尾
while ~feof(fileID)
% 读取一个结构体的数据
zwData = fread(fileID, structSize, 'uint8=>uint8');
if numel(zwData) ~= structSize % 检查是否读取了完整的结构体数据
error('!!!!!!!!!!!文件内容不完整或结构定义不正确!!!!!!!!!!!');
end
% 解析数据
x = int16(typecast(zwData(1:2), 'int16'));
y = int16(typecast(zwData(3:4), 'int16'));
z = int16(typecast(zwData(5:6), 'int16'));
c = int16(typecast(zwData(7:8), 'int16'));
it = int32(typecast(zwData(9:12), 'int32'));
oo = int32(typecast(zwData(13:16), 'int32'));
qwe = single(typecast(zwData(17:20), 'single'));
% 创建并填充MATLAB结构体
currentStruct = BBB;
currentStruct.aaa.x = x;
currentStruct.aaa.y = y;
currentStruct.aaa.z = z;
currentStruct.aaa.c = c;
currentStruct.it = it;
currentStruct.oo = oo;
currentStruct.qwe = qwe;
structs{end+1} = currentStruct;
end
% 关闭文件
fclose(fileID);
% 如果需要,可以调整structs的大小以匹配实际读取的结构体数量
% structs = structs(1:index-1);
% 现在structs是一个cell数组,其中包含从二进制文件中读取的结构体
disp('finished');