在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3971|回复: 1

matlab 中的位操作,实现数据的压缩存放

[复制链接]
发表于 2009-9-10 21:39:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 eecsseudl 于 2013-4-29 10:03 编辑

clear all
clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 当 tempBitCount>8 时进行移位
arrayBitCount = 0;
arrayCount = 0;
tempBuff = 0;
%arrayBuf = 0;
%matlab中列优先
% 测试 :把  magic(5) 中的 25 个数据按照 6 bits 方式记录
data = magic(5);
[row,col] = size(data) ;

fid = fopen('magic5.dat','wb');

for i = 1:col
    for j = 1:row
        curData = data(j,i)
        curNum = 5;
        % 存入一个一维uint8数组arrayBuf
        tempBuff = bitshift(tempBuff,curNum)+bitand(bitshift(1,curNum)-1,curData);
        arrayBitCount = arrayBitCount + curNum;
        while(arrayBitCount>7)
            arrayBitCount = arrayBitCount - 8;  % 每次 8 bits
            tempData = bitshift(bitand(bitshift(255,arrayBitCount),tempBuff),-arrayBitCount);
            %tempData =  bitand(bitshift(255,arrayBitCount),tempBuff)/bitshift(1,arrayBitCount)
            fwrite(fid,tempData,'integer*1');  % 把最高的 8 bits写入文件
            arrayCount = arrayCount+1; %记录数组中,数组下标偏移
            arrayBuf(arrayCount) = tempData;
            tempBuff = bitand(tempBuff,bitshift(1,arrayBitCount)-1); % 将高8bits清空
        end % end while
    end % j
end % i

if(arrayBitCount>0)
    tempData = bitshift(tempBuff,7-arrayBitCount);
    fwrite(fid,tempData,'integer*1');
    arrayCount = arrayCount+1; %记录数组中,数组下标偏移
    arrayBuf(arrayCount) = tempData;
end;
fclose(fid);

由于magic(5)产生的数据最大值为 25,因此使用 5bits 就能完整的存放一个数据,这样实际需要的储存空间只需要
25*5/8个字节就足够!







encode.zip

712 Bytes, 下载次数: 0 , 下载积分: 资产 -2 信元, 下载支出 2 信元

 楼主| 发表于 2009-9-11 00:31:15 | 显示全部楼层

恢复

clear all
clc

arrayCount = 0;
fid = fopen('magic5.dat','rb');
while ~feof(fid)
    [row_array,ele_count] = fread(fid,512,'uint8=>uint8')
    arrayBuf(arrayCount+1:arrayCount+ele_count) = row_array';
    arrayCount = arrayCount + ele_count;
    if ele_count < 512          % elecount < 512代表数据不够,已经到了文件的结尾
        break ;
    end
end
fclose(fid);

% arrayCount 记录 arrayBuf 数组的长度
% arrayBuf   记录从文件读取的数据
%%%%%%%%%%%%%%%%%%%%%%%%%%%%  数据解缩  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 当 tempBitCount>8 时进行移位
arrayBitCount = 0;  % 记录当前的有效位数
tempBuff = 0;
arrayCount = 0;
%matlab中列优先
% 测试 :把  magic(5) 中的 25 个数据按照 5 bits 方式记录恢复成 8 bits存放
data = magic(5);
[row,col] = size(data) ;

fid = fopen('magic5.txt','wb');

for i = 1:5
    for j = 1:5
        curNum = 6;
        % 从一维uint8数组arrayBuf读取数据
        while ( arrayBitCount<= curNum )
            arrayCount = arrayCount + 1
            tempData = uint32(arrayBuf(arrayCount))  % 强制类型转换
            tempBuff
            bitshift(tempBuff,8)
            tempBuff = bitshift(tempBuff,8) + bitand(bitshift(1,8)-1,tempData)
            arrayBitCount = arrayBitCount + 8
        end
        arrayBitCount = arrayBitCount - curNum  % 截取高 curNum 位
        curData = bitshift( tempBuff,-arrayBitCount)
        tempBuff = bitand(tempBuff,bitshift(1,arrayBitCount)-1)
        
        magicData(j,i) = curData;
    end % j
end % i

fclose(fid);

decode.zip

814 Bytes, 下载次数: 0 , 下载积分: 资产 -2 信元, 下载支出 2 信元

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-19 18:27 , Processed in 0.017214 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表