该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
里面还有点汇编
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.