您的当前位置:首页正文

将源文件读入matlab后二进制输出到文本文件

2024-11-08 来源:个人技术集锦
% [此程序为最新版]11.14更新程序,可以直接读取某个路径的文件,然后获取其文件名
% 输入:inData文件夹
% 输出:outData文件夹
% 345M文件生成二进制时间为126.9375秒,还原为源文件时间为243.2653秒
function [] = convert_to_binary()
%% 将源文件转为二进制 
clear all;
clc;
%C:\Users\Cheng YuQi\Desktop\
tic;%统计时间
Dir=dir('E:\Binary\_to_java\_inData');%_inData文件名
filename=strcat(Dir(3).folder,'\',Dir(3).name);%生成路径
file_id = fopen(filename, 'rb');%file_id:文件句柄值
fid=fopen('E:\Binary\_to_java\_outData\outdata.txt','w+');%输出

while(feof(file_id) == 0)
    data = fread(file_id, 30 * 10^6);%XX为存放数据的矩阵  每次读取30 * 10^6个字节
    data = uint8(data);
    dataOut = dec2bin(data);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % dataOut = uint8(zeros(length(data), 8));
    % for i=1:1:8
    %     dataOutTmp = rem(data(:,1),2);
    %     data = floor(data / 2);
    %     dataOut(:, 9 - i) = dataOutTmp;
    % end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % dataOut = dataOut';
    % dataOut = dataOut(:);
    % [x, y] = size(dataOut);
    fprintf(fid,'%s',dataOut');%fprintf按列输出dataOut的元素,所以需要将其转置
end

fclose('all');
t1 = toc;%统计时间
disp(['生成二进制时间为',num2str(t1),'秒']);

%% 将二进制还原为源文件
tic;
fid = fopen('E:\Binary\_to_java\_outData\outdata.txt','rb');

% i=find('.'==Dir(3).name);%寻找后缀名前面的标志‘.’
% suffix=Dir(3).name(i:end);%去除文件名,提取单纯的文件后缀
filename2=strcat('E:\Binary\_to_java\_outData\',Dir(3).name);%生成含后缀的路径
file_id = fopen(filename2, 'wb');

while(feof(fid) == 0)
    A = fread(fid, 30 * 10^7);
    A = A - 48;
    x = size(A, 1);
    Areshape = reshape(A, 8, x/8)';%按照列填充

    %bin2dec运行太慢,程序替换此函数 begin
    for i=1:1:8
       Areshape(:,i) = Areshape(:,i) * (2^(8-i));
    end
    Areshape = sum(Areshape, 2);%按行相加(1:按行,2:按列)
    Areshape = uint8(Areshape);
    %bin2dec运行太慢,程序替换此函数 end

    fwrite(file_id,Areshape,'uint8');
end

fclose('all');%解决fclose了test.rar文件后,文件仍然占用的问题
t2 = toc;%统计时间
disp(['还原为源文件时间为',num2str(t2),'秒']);
Top