How to convert 24-bit signed hex from .csv file to an array of decimal data?
12 views (last 30 days)
Show older comments
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
0 Comments
Accepted Answer
Jan
on 23 Jul 2019
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 Comments
Guillaume
on 23 Jul 2019
Note that:
data = table2array(dataTable(:,1));
is simply:
data = dataTable{:, 1};
%or
data = dataTable.(1);
%or
data = dataTable.Data;
More Answers (1)
Guillaume
on 23 Jul 2019
Edited: Guillaume
on 23 Jul 2019
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;
See Also
Categories
Find more on Data Type Conversion in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!