How to convert 24-bit signed hex from .csv file to an array of decimal data?

14 ビュー (過去 30 日間)
Neo
Neo 2019 年 7 月 23 日
コメント済み: Neo 2019 年 7 月 23 日
The csv file has content like below, the hexical data is signed 24-bit and has 0x prefix:
============
DATA
0xfd22cc
0xfe89d1
0xff8d8b
0x004b41
0x00d9d5
0x0125fa
==============
I have a few challenges, not quite good with coding with Matlab:
1) How to get rid of 0x prefix?
2) How to convert the signed 24-bit hex to decimal?
I came up with a really ugly code to do the work, but would love to learn a elegant way:
%% Read in data
dat = readtable('demo.csv');
dat1 = table2array(dat(:,1));
out = strip(dat1,'left','0');
out = strip(out,'left','x');
out_dec = typecast(uint32(base2dec(out, 16)), 'int32');
for i=1:length(out_dec)
if out_dec(i) < 2^23
out_signed(i) = out_dec(i);
else
out_signed(i) = out_dec(i) - 2^24;
end
end

採用された回答

Jan
Jan 2019 年 7 月 23 日
dataTable = readtable('demo.csv');
data = table2array(dataTable(:,1));
data = strrep(data, '0x', '');
dataDec = base2dec(data, 16);
index = dataDec >= 2^23;
dataDec(index) = dataDex(index) - 2^24;
I prefer the faster sscanf to convert hex strings to decimals.
  2 件のコメント
Guillaume
Guillaume 2019 年 7 月 23 日
Note that:
data = table2array(dataTable(:,1));
is simply:
data = dataTable{:, 1};
%or
data = dataTable.(1);
%or
data = dataTable.Data;
Neo
Neo 2019 年 7 月 23 日
very helpful, thanks.

サインインしてコメントする。

その他の回答 (1 件)

Guillaume
Guillaume 2019 年 7 月 23 日
編集済み: Guillaume 2019 年 7 月 23 日
I agree with Jan that sscanf is nicer and for that reason:
dataTable = readtable('demo.csv');
dataDec = rowfun(@(s) sscanf(s, '%x'), dataTable, 'ExtractCellContents', true, 'OutputFormat', 'uniform')
dataDec(dataDec > 2^23) = dataDec(dataDec > 2^23) - 2^24;

カテゴリ

Help Center および File ExchangeData Type Conversion についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by