0

我正在尝试读取包含十六进制数据和文本组合的 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 读取此数据并将十六进制转换为十进制的帮助将不胜感激。

4

2 回答 2

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'     ''

您需要过滤掉空单元格,对其进行重塑等,但这对您来说是一个快速而肮脏的解决方案。

于 2013-07-01T19:15:45.003 回答
0

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

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转换为单元字符串后删除与标签对应的数字。

于 2013-07-01T19:41:04.267 回答