无损数据压缩算法c语言,短短的C代码,帮忙,看看压缩算法,感激不尽

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

里面还有点汇编

function InzDword(const Readed:DWORD):DWORD;

var

tmpBytes,tmpBytes1:array[0..sizeof(DWORD)] of byte;

i:shortint;

begin

move(readed,tmpBytes1[0],sizeof(DWORD));

for I := 0 to sizeof(DWORD) - 1 do

begin

tmpbytes:=tmpBytes1[sizeof(DWORD)-i-1];

end;

move(tmpbytes[0],result,sizeof(DWORD));

end;

type

stuFile = Record // Attention: All the 'DWORD' is in big-endian,you shoule covert it to b-e.

Name:Ansistring; //FILE NAME

ZERO:Array of BYTE; //zero ,no use

OriSize:DWORD; //Original Size

Offset:DWORD; //file offset,but it should be divede&mod by 10MB,then you will know which file it locate.

Length:DWORD; //file length.

End;

procedure TForm1.FormCreate(Sender: TObject);

var

fileaddress:string;

FileHeader:DWORD;

fhandle:integer;

Buffer:array of stufile;

vnCounter:Integer;

outName:string;

outHandle:integer;

fbuffer:Pbyte;

pathcounter:integer;

pathbuffer:array[0..255] of byte;

Compress,decompress:Tmemorystream;

begin

opendialog1.Execute();

if opendialog1.FileName<>'' then

begin

fileaddress:=opendialog1.FileName;

try

//********************************************

//Read Link Data

//********************************************

fhandle:=fileopen(fileaddress,fmopenread);

fileread(fhandle,fileheader,4); //Total File Num

fileheader:=InzDword(Fileheader);

setlength(buffer,fileheader+1);

for vnCounter := 0 to fileheader - 1 do // We can't read all the data once & Path should be treated specially.

begin

for pathcounter:=0 to 256 do //get file path first,buffer may be used.

begin

fileread(fhandle,pathbuffer[pathcounter],1);

if pathbuffer[pathcounter]=0 then

break;

end;

//Every File got $8c no matter its size.

setlength(buffer[vnCounter].Name,pathcounter);

move(pathbuffer[0],pbyte(buffer[vnCounter].Name)^,pathcounter);

fileseek(fhandle,-1,1);

setlength(buffer[vnCounter].zero,$80-pathcounter);

fileread(fhandle,buffer[vnCounter].ZERO[0],$80-pathcounter); //Rest of the lnks.

fileread(fhandle,buffer[vnCounter].OriSize,12);

end;

fileclose(fhandle);

//**********************************************************************

//Covert & Unpack

//*********************************************************************

fhandle:=0;

fileaddress:=extractfilepath(fileaddress);

for vnCounter := 0 to fileheader - 1 do

begin

buffer[vnCounter].OriSize:=InzDword(buffer[vnCounter].OriSize);

buffer[vnCounter].Length:=InzDword(buffer[vnCounter].Length);

buffer[vnCounter].Offset:=InzDword(buffer[vnCounter].Offset);

buffer[vnCounter].Name:=StringReplace(buffer[vnCounter].Name,ansistring('/'),ansistring('\'),[rfReplaceAll,rfIgnoreCase]);

if buffer[vnCounter].Name='' then

continue;

outName:=fileaddress+'OUTPUT\'+buffer[vnCounter].Name;

if not DirectoryExists(ExtractFilePath(outName)) then

ForceDirectories(ExtractFilePath(outName));

outHandle:=filecreate(outName);

if outhandle=-1 then

outHandle:=fileopen(outName,fmopenwrite);

if not((vnCounter>0) and ((buffer[vnCounter-1].Offset div 10485760)=(buffer[vnCounter].Offset div 10485760))) then

fhandle:=fileopen(fileaddress+format('bin\data%.3d.bin',[(buffer[vnCounter].Offset div 10485760)]),fmopenread);

fileseek(fhandle,(buffer[vnCounter].Offset mod 10485760),0);

fbuffer:=sysgetmem(buffer[vnCounter].Length+1); //Get the Packed data

fileread(fhandle,fbuffer[0],buffer[vnCounter].Length);

{begin

Lz77_HatsuneTakumi(fbuffer,New_Buffer,buffer[vnCounter].Length,Decode_Size2);

sysfreemem(fbuffer);

end;}

begin

decompress:=Tmemorystream.Create;

Compress:=Tmemorystream.Create;

Compress.Write(fbuffer[0],buffer[vnCounter].Length);

compress.Position:=0;

decompress.Position:=0;

Lz77_HatsuneTakumi_Stream(Compress,decompress,buffer[vnCounter].Length);

compress.Destroy;

sysfreemem(fbuffer);

//if decompress.Size<>buffer[vnCounter].OriSize then continue;

fbuffer:=sysgetmem(decompress.Size);

decompress.Position:=0;

decompress.Read(fbuffer[0],decompress.Size);

//buffer[vnCounter].OriSize:=decompress.Size;

decompress.Destroy;

end;

filewrite(outhandle,fbuffer[0],buffer[vnCounter].OriSize);

fileclose(outHandle);

sysfreemem(fbuffer);

end;

except

ShowMessage('Error.'#13#10+'NAME: '+buffer[vnCounter].Name+#13#10+'NUMBER: '+IntToStr(vnCounter));

fileaddress:='';

application.terminate;

end;

ShowMessage('Finished.');

fileclose(fhandle);

fileaddress:='';

end;

application.terminate;

end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值