Pak Format

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Lunatix

Betreff: Pak Format

BeitragSo, Aug 13, 2006 9:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleines Tutorial über Pak Files :


Code: [AUSKLAPPEN]

Function InitPak(pak_path$)
stream = ReadFile(pak_path)


3bytes : pak -> als pak identifizieren

Code: [AUSKLAPPEN]

for i = 0 to 2
 sig$ = sig + chr(ReadByte(Stream))
next
if not sig$ = "pak" then Return -1


4bytes(int) : paksize -> ateigrösse der *.pak angeben
4bytes(int) : Headsize -> Grösse der datei ohne body (für banks)
4bytes(int) : Bodysize -> Grösse der datei ohne header (für banks)
*****Ab hier geht der Header "richtig" los*****
Code: [AUSKLAPPEN]

Bank = CreateBank(HeadSize)
For i = 0 to HeadSize-1
  PokeByte bank,ReadByte (Stream)
next

4bytes(int) : anzahl der dateien (PeekInt(bank,pos) : pos = pos + 4)
**Alle Dateien auflisten**
4bytes(int) : Datei grösse
4bytes(int) : Datei Position in pak datei (für SeekFile)
2bytes(short) : Länge des Dateinamen (Len)
x Bytes : Ascii zeichen des Dateinamen (For i = 0 to Len_FileName-1)


Code: [AUSKLAPPEN]

For i = 0 to DateiAnzahl-1

 File_Size = PeekInt(bank,pos) : pos = pos + 4
 File_Pos = PeekInt(bank,pos) : pos = pos + 4
 Len_FName = PeekShort(bank,pos) : pos = pos + 4
 For i = 0 to Len_Fname-1
   byte = peekbyte(bank,pos)
   File_Name$ = File_Name + chr(byte)
   pos = pos + 1
 next
 F.TPakFile = new TPakFile
 F\size = File_Size
 F\Pos = File_Pos
 F\Name$ = File_Name$
 F\PakFile$ = Pak_Path$
next


****END OF HEADER***
Code: [AUSKLAPPEN]

closefile (stream)

P.TPakStream = new TPakStream
P\id = Handle(p)
P\path$ = pak_path$

return P\id

End Function


So, nun haben wir alle Informationen und können beliebig eine oder alle dateien Entpacken oder sogar direkt vom pak stream auslesen und laden.

Code: [AUSKLAPPEN]


Image = LoadImage(LoadFile(pak00,"bilder/bild.bmp","pak00"))

Function LoadFile$(pakID,path$,FileTo$)  ;PakID wäre der wert, der bei InitPak zurückgegeben wird

 path = Replace(path,"/","\") ; für Dateinamen-Vergleiche "/" slashes mit "\" ersetzen

 For P.TPakStream = each TPakStream
  if P\id = pakID
   For T.TPakFile = each TPakFile
     if T\pakFile = P\path
       if lower(T\Name) = lower(path)
         Stream = readFile(P\path)
         StreamTo = WriteDirFile(FileTo+path) ;<- datei mit dirs schreiben (siehe unten)
         Seekfile Stream,T\Pos
         For i = 0 to T\Size-1
          byte = ReadByte(Stream)
          ;Hier könnte man das byte noch decodieren
          WriteByte StreamTo,byte
         next
       endif
     endif
   next
  endif
 next

return FileTo+path

end function

Function WriteDirFile(file$)
   For i = 1 To Len(File)
      z$ = Mid(File,i,1)
      If z="/" Or z="\"
         If FileType (dir+DirName$) <> 2
            CreateDir (dir+DirName)
         EndIf
      EndIf
      DirName$ = DirName + z
   Next
   f = WriteFile (file)
   Return f
end function




So könnte (oder ist) eine Pak datei aufgebaut, kann man noch beliebig mit passwort im header oder passwort für jede datei Datei verschlüsselb... etc. ausbauen.

MFG JP
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

DATIS

Betreff: Danke

BeitragMi, Aug 23, 2006 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool, danke.
Sowas kann ich gebrauchen Very Happy
Frauen und Technik?
Männer und BHs?

Beides möglich.

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group