将HEX和Text数据从一个文件导入Matlab

时间:2013-07-01 18:40:25

标签: matlab text hex

我正在尝试读取包含十六进制数据和文本组合的txt文件。我想将十六进制转换为十进制除了然后操纵。这是一些示例数据。

  

x 0:47950 0x ---- 0x ---- 001:00:07:56.633300 9-R-04-04 0x8000   0x0012 0x0000 0x0000

     

x 0:136994 0x ---- 0x ---- 001:00:13:14.350422 8-R-05-04 0x8000   0x0012 0x0000 0x0000

     

x 0:532637 0x ---- 0x ---- 001:00:40:29.861743 7-R-06-04 0x8000   0x0012 0x0000 0x0000

这里的前四列有点无用('x 0:47950 0x ---- 0x ----')但是时间戳,标签(9-R-04-04)和十六进制是我的意思想看看。有关如何让Matlab读取此数据并将十六进制转换为十进制的任何帮助将非常感激。

2 个答案:

答案 0 :(得分:0)

% open and read the entire file
fid = fopen('temp.txt');
A = fread(fid);
fclose(fid);
% convert to text strings
txt = char(A)';
% create a cell array of lines
regexp(txt,'\n','split')
lines = regexp(txt,'\n','split');
% match the desired text
desTextCell = regexp(lines,'\d{3}:.+','match');
out = cellfun( @(x) regexp(x,'\s','split'), desTextCell);
out =
   {1x1 cell}    {1x1 cell}    {1x1 cell}     {}
out{1}{:}

ans = 

  Columns 1 through 5

    '001:00:07:56.633300'    '9-R-04-04'    '0x8000'    '0x0012'    '0x0000'

  Columns 6 through 7

    '0x0000'     ''

你需要过滤掉空单元格,重新整形等,但这对你来说是一个快速而又肮脏的解决方案。

答案 1 :(得分:0)

只要标记为固定宽度(此处为9个字符),您就可以使用fscanf()导入所有内容。我跳过前4个字符串,然后导入分隔天(?),小时,分钟,秒(以毫秒为单位)的时间戳(这样你可以将其提供给datenum),然后我导入标签的9个字符映射到ASCII位置,最后是四个十六进制数:

fid  = fopen('test.txt');
data = fscanf(fid, '%*s %*s %*s %*s %f:%f:%f:%f %s %x %x %x %x',[17,inf])';
fclose(fid);
tag = cellstr(char(data(:,5:13)));

请注意,您总共有17个字段,4个用于时间戳,9个字符用于标记和4个十六进制数字,但您可以在转换后删除data中与该标记对应的数字它是一个细胞串。