工作需要,需要读取十六进制的数据,并转化成short类型的数据,实际上在定点复数运算中经常会有这样的数据,但是matlab在数据转化中,没有c灵活,还是费了一些周折。试过直接强制转化int16的数据,发现matlab直接就将符号位丢弃了,所以才想到这个办法。
%函数功能:本程序是读入一个十六进制的数据,将其16bits组成一个有符号的
%short型数据
clc;
clear;
close all;
fid = fopen('test.txt');%打开文件,这里面存储了十六进制的数据
fseek(fid,0,'bof');%将fid指向文件的开始
data = fscanf(fid,'%x',[1,20]);%读取20个字节的数据
data_unshort = zeros(1,10);%创建一个1*10的矩阵存储无符号的数据
data_short = zeros(1,10);%创建一个1*10的矩阵存储有符号的数据
data = int32(data);%强制转化成有符号的32bit的数据,避免直接用char型数据操作的时候越界。
j =1 ;%数组下标
for i = 1:2:20;
data_unshort(j) = data(i)*256 + data(i+1);%将两个字节的数据进行组成一个short型数据
sign_flag = bitget(data_unshort(j),16:16);%读取第16bit的数据,作为符号位
if 1 == sign_flag ; %满足条件,说明是负数
%把这个数据看成补码 ,补码 减去1,再去掉最高位,就是反码。
data_unshort(j) =data_unshort(j) -1 -32768;
%反码除了符号位其他bit取反就是原码
data_unshort(j) = bitxor(data_unshort(j),32767);
%给原码加上符号就是带符号的short型数据
data_short(j) = -int16(data_unshort(j)) ;
else %如果是正数,那么就不需要进行转化。
data_short(j) = data_unshort(j) ;
end
j =j+1;
end
data_max = max(data_short);
data_min = min(data_short);
x = 1:10;
y = data_short;
plot(x,y);
title(sprintf('max = %d ,min = %d',data_max,data_min));