matlab读取十六进制数转化成有符号的short

工作需要,需要读取十六进制的数据,并转化成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));
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值