matlab解析二进制结构体数据(嵌套结构体)

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');
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值