如何用Matlab以十六进制逐位读取专有格式文件提取浮点数据?
可行,用Matlab以十六进制读取原始数据完全避免信息丢失
核心原理
直接以二进制模式读取文件的原始字节,跳过文本编码转换步骤,所有原始数据都会被完整保留,不会出现因字符不兼容导致的信息丢失。Matlab原生支持二进制文件操作,完全能实现这个需求。
具体实现脚本
以下是完整的Matlab脚本,包含文件读取、十六进制转换、目标数据提取的步骤:
% 1. 打开目标文件(二进制模式,禁止编码转换) fileID = fopen('你的文件路径', 'rb'); if fileID == -1 error('文件打开失败,请检查路径'); end % 2. 读取全部原始字节为无符号8位整数数组 rawBytes = fread(fileID, '*uint8'); fclose(fileID); % 3. 将字节数组转换为连续的十六进制字符串 hexStr = dec2hex(rawBytes)'; hexStr = hexStr(:)'; % 转为一维字符串,方便后续匹配 % 4. 定义已知的浮点数-十六进制映射表 targetMap = containers.Map(... {'803F', '0040', '4040', '8040', 'A040', 'C040', 'E040', '0041', '1041'}, ... {1, 2, 3, 4, 5, 6, 7, 8, 9}); % 5. 查找并提取目标数据(按双字节匹配,对应4位十六进制) matchTokens = regexp(hexStr, '([0-9A-F]{4})', 'match'); extractedValues = []; for chunk = matchTokens hexChunk = chunk{1}; if isKey(targetMap, hexChunk) extractedValues = [extractedValues, targetMap(hexChunk)]; end end % 输出结果 disp('提取到的目标浮点数:'); disp(extractedValues);
注意事项
- 如果文件中目标数据的字节序和你提供的映射相反(比如存储为小端,映射是大端),可以修改匹配逻辑,反转每个双字节的顺序:
% 反转字节序的匹配方式 matchTokens = regexp(hexStr, '([0-9A-F]{2})([0-9A-F]{2})', 'tokens'); extractedValues = []; for token = matchTokens reversedHex = [token{1,2}, token{1,1}]; % 交换两个字节的十六进制字符串 if isKey(targetMap, reversedHex) extractedValues = [extractedValues, targetMap(reversedHex)]; end end - 可以根据实际需求调整读取范围(比如只读取文件的某一部分),修改
fread的参数即可。
内容的提问来源于stack exchange,提问作者Sandeu
相关产品推荐
相关产品推荐

