我正在尝试读取包含十六进制数据和文本组合的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读取此数据并将十六进制转换为十进制的任何帮助将非常感激。
答案 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
中与该标记对应的数字它是一个细胞串。