ZIP-Archive mit BlitzBasic

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

David

Betreff: ZIP-Archive mit BlitzBasic

BeitragDo, Okt 14, 2004 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Da ich im Moment privat an einer simplen 3D Engine programmiere, hatte ich vor kurzem ein Problem, bei dem sich mir die Frage stellte, wie die Engine Dateien am besten verwalten könnte.
Ich hab' dann eine Methode genommen, welche schon von Quake3 bekannt ist. Nämlich alle Dateien in Packages, in Form von ZIP-Archiven, zu speichern.

Also habe ich kurz entschlossen eine kleine Library geschrieben, welche ZIP-Archive laden und Dateien daraus extrahieren kann.

Aus den dabei gewonnen "Kenntnissen" über ZIP-Archive, habe ich dann noch einen BlitzBasic Beispielscode geschrieben, der grob verdeutlichen soll, wie man ZIP-Datein auch in BlitzBasic verwenden könnte.
Ob es Sinn macht, ist natürlich wieder eine andere Frage. Wink

Nebenbei ist bemerkt, das der Code keine der Kompressionsverfahren unterstützt, welche vom ZIP-Format angeboten werden.
Weiterhin kann der Code keine Dateien aus dem ZIP-Archive "entpacken", was man aber mit ein paar Zeilen Code realisieren könnte.

ZIP-Format, grober Überblick:

[DateiHeader 1]
[Dateidaten 1]
[DateiDescription 1]
.
.
.
[DateiHeader n]
[Dateidaten n]
[DateiDescription n]

[Central Directory]
[End Central Directory]

DateiHeader 1 - DateiHeader n: Hier sind die Dateidaten gespeichert, im Falle von unkomprimierten Dateien können die Daten einfach ausgelesen und in eine externe Datei gespeichert werden.

Central Directory: Hier befindet sich eine Liste aller Dateien in diesem ZIP-Archiv + verschiedene Informationen zur betreffenden Datei (z.B. Offset etc...)

End Central Directory: Hier befindet sich der "ZIP Footer", also alle Informationen über das ZIP-Archiv


So, nach dieser, sehr knappen Erklährung des ZIP-Formats der Beispielscode:

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600, 32

; === Types ============================

Type CentralDirEnd_t
Field Signature%
Field DiskNumber%
Field CentralDirDisk%
Field NumEntry%
Field TotalNumEntry%
Field CentralDirSize%
Field CentralDirOffset%
Field CommentLength%
Field Comment$
End Type

Type CentralDirFileHeader_t
Field Signature%
Field MadeByVer%
Field ExtractVer%
Field BitFlag%
Field Compression%
Field LastModTime%
Field LastModDate%
Field CRC32%
Field CompressedSize%
Field UncompressedSize%
Field FileNameLength%
Field ExtraFieldLength%
Field FileCommentLength%
Field DiskNumberStart%
Field InternalAttr%
Field ExternalAttr%
Field Offset%
Field FileName$
Field ExtraField$
Field FileComment$
End Type

; === Konstanten =========================

; ZIP Footer Signatur
Const SIG_CENTRALDIREND = $06054b50

; Dateiname/Pfad zur Zipdatei
Const FileName$ = "Zipfile.zip"



; === Hauptteil ==========================

; Lesen der Dateigroesse
DataSize% = FileSize( FileName$ )

; Oeffnen der Datei
Stream% = OpenFile( FileName$ )

; Zip Footer einlesen
ZipFooter.CentralDirEnd_t = ReadZIPFooter( Stream%, DataSize% )

; Central Dir einlesen
ReadCentralDir( Stream%, ZipFooter )

; Datei schliessen
CloseFile( Stream% )

; Testausgabe der Dateinamen
For currEntry.CentralDirFileHeader_t = Each CentralDirFileHeader_t
Print currEntry\FileName
Next

; Auf Tastendruck warten
WaitKey

; Beenden
End



; === Funktionsteil ======================

; ========================================
;
; ReadZipString()
;

Function ReadZipString$( Stream%, Length% )
; Wenn die Laenge 0 ist brauch nichts eingelesen zu werden
If ( Not Length% ) Return

; Rueckgabevariable einen Leerstring uebergeben
Result$ = ""

; "Length%" Bytes einlesen und zu einem String zusammenfuegen
For i = 0 To Length%-1
Result$ = Result$ + Chr$( ReadByte( Stream% ) )
Next

; Den eingelesenen String zurueckgeben
Return Result$
End Function

; ========================================
;
; ReadZIPFooter
;

Function ReadZIPFooter.CentralDirEnd_t( Stream%, Size% )
; Neues Objekt erstellen
Local ZipFooter.CentralDirEnd_t = New CentralDirEnd_t

; Ist ueberhaupt eine Datei geoeffnet??
If ( Not Stream ) Return

; Position auf das vorletzte Byte im Stream setzen
Pos% = Size% -1
SeekFile( Stream%, Pos% )

; Suchen des ZIP Footers
While ( True )
; vier Bytes einlesen
Val% = ReadInt( Stream% )

; ist der eingelesene Wert ungleich der ZIP Footer Signatur?
If ( Val% <> SIG_CENTRALDIREND ) Then
; Dateizeiger um eins verringern
Pos% = Pos% - 1
SeekFile( Stream%, Pos% )
Else
; Dateizeiger vier Byte nach hinten setzen
SeekFile( Stream%, Pos% )
Exit
End If
Wend

; Einlesen der ZIP Footer Daten
ZipFooter\Signature = ReadInt( Stream% )
ZipFooter\DiskNumber = ReadShort( Stream% )
ZipFooter\CentralDirDisk = ReadShort( Stream% )
ZipFooter\NumEntry = ReadShort( Stream% )
ZipFooter\TotalNumEntry = ReadShort( Stream% )
ZipFooter\CentralDirSize = ReadInt( Stream% )
ZipFooter\CentralDirOffset = ReadInt( Stream% )
ZipFooter\CommentLength = ReadShort( Stream )
ZipFooter\Comment$ = ReadZipString( Stream%, ZipFooter\CommentLength )

; ZIP Footer Objekt zurueckgeben
Return ZipFooter
End Function

; ========================================
;
; ReadCentralDir
;

Function ReadCentralDir( Stream%, CentralDirEnd.CentralDirEnd_t )
; Ist ein Stream geoeffnet???
If ( Not Stream% ) Return

; Dateizeiger auf das erste Byte vor dem Central Directory setzen
SeekFile( Stream%, CentralDirEnd\CentralDirOffset )

; Einlesen der Datei-Header
For i = 0 To CentralDirEnd\NumEntry-1

; Neues Objekt erstellen
newEntry.CentralDirFileHeader_t = New CentralDirFileHeader_t

; Lesen der Daten in das neu erstellte Objekt
newEntry\Signature = ReadInt( Stream% )
newEntry\MadeByVer = ReadShort( Stream% )
newEntry\ExtractVer = ReadShort( Stream% )
newEntry\BitFlag = ReadShort( Stream% )
newEntry\Compression = ReadShort( Stream% )
newEntry\LastModTime = ReadShort( Stream% )
newEntry\LastModDate = ReadShort( Stream% )
newEntry\CRC32 = ReadInt( Stream% )
newEntry\CompressedSize = ReadInt( Stream% )
newEntry\UncompressedSize = ReadInt( Stream% )
newEntry\FileNameLength = ReadShort( Stream% )
newEntry\ExtraFieldLength = ReadShort( Stream% )
newEntry\FileCommentLength = ReadShort( Stream% )
newEntry\DiskNumberStart = ReadShort( Stream% )
newEntry\InternalAttr = ReadShort( Stream% )
newEntry\ExternalAttr = ReadInt( Stream% )
newEntry\Offset = ReadInt( Stream% )
newEntry\FileName$ = ReadZipString( Stream%, newEntry\FileNameLength )
newEntry\ExtraField$ = ReadZipString( Stream%, newEntry\ExtraFieldLength )
newEntry\FileComment$ = ReadZipString( Stream%, newEntry\FileCommentLength )
Next
End Function


So, nach dieser sehr kurzen Anleitung (was auch immer Wink) hoffe ich, das vielleicht irgendjemand doch nutzen aus dem Unfug ziehen kann! Smile

grüße
http://bl4ckd0g.funpic.de
 

OJay

BeitragDo, Okt 14, 2004 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
hm nicht übel. wenn es so funktioniert...habs nicht getestet...
obwohl es eher den character eines codearchiveintrages hat Smile
erweiters doch mal noch um die lese-funktion, und evtl auch um kompression. währe sicher sehr nützlich.
 

David

BeitragDo, Okt 14, 2004 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ja, das mit dem Codearchiv kahm mir danach auch! Wink
Evtl erweiter ich das Ding noch, falls mir meine Arbeit mal wieder Zeit gewährt! Smile

grüße
http://bl4ckd0g.funpic.de
 

David

BeitragDo, Okt 14, 2004 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

So, jetzt kann man aus unkomprimierten Zip-Archiven Dateien extrahieren.
Es sei allerdings noch bemerkt, das ich den Code nicht ausgiebig getestet habe und das noch Bugs vorhanden sein könnten.
Bei meinen Tests hat allerdings alles geklappt!

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600, 32

; === Types ============================

Type CentralDirEnd_t
Field Signature%
Field DiskNumber%
Field CentralDirDisk%
Field NumEntry%
Field TotalNumEntry%
Field CentralDirSize%
Field CentralDirOffset%
Field CommentLength%
Field Comment$
End Type

Type CentralDirFileHeader_t
Field Signature%
Field MadeByVer%
Field ExtractVer%
Field BitFlag%
Field Compression%
Field LastModTime%
Field LastModDate%
Field CRC32%
Field CompressedSize%
Field UncompressedSize%
Field FileNameLength%
Field ExtraFieldLength%
Field FileCommentLength%
Field DiskNumberStart%
Field InternalAttr%
Field ExternalAttr%
Field Offset%
Field FileName$
Field ExtraField$
Field FileComment$
End Type

Type LocalFileHeader_t
Field Signature%
Field ExtractVer%
Field BitFlag%
Field Compression%
Field LastModTime%
Field LastModDate%
Field CRC32%
Field CompressedSize%
Field UncompressedSize%
Field FileNameLength%
Field ExtraFieldLength%
Field FileName$
Field ExtraField$
End Type

; === Konstanten =========================

; ZIP Footer Signatur
Const SIG_CENTRALDIREND = $06054b50

; Dateiname/Pfad zur Zipdatei
Const FileName$ = "Zipfile.zip"
Const Extract_Path$ = "Tmp"


; === Hauptteil ==========================

; Lesen der Dateigroesse
DataSize% = FileSize( FileName$ )

; Oeffnen der Datei
Stream% = OpenFile( FileName$ )

; Zip Footer einlesen
ZipFooter.CentralDirEnd_t = ReadZIPFooter( Stream%, DataSize% )

; Central Dir einlesen
ReadCentralDir( Stream%, ZipFooter )

; Ordnerstruktur erstellen
CreateFolders( Extract_Path$ )

; Dateien extrahieren
ExtractFiles( Stream% )

; Datei schliessen
CloseFile( Stream% )

; Testausgabe der Dateinamen
For currEntry.CentralDirFileHeader_t = Each CentralDirFileHeader_t
Print currEntry\FileName
Next

; Auf Tastendruck warten
WaitKey

; Beenden
End



; === Funktionsteil ======================

; ========================================
;
; ReadZipString()
;

Function ReadZipString$( Stream%, Length% )
; Wenn die Laenge 0 ist brauch nichts eingelesen zu werden
If ( Not Length% ) Return

; Rueckgabevariable einen Leerstring uebergeben
Result$ = ""

; "Length%" Bytes einlesen und zu einem String zusammenfuegen
For i = 0 To Length%-1
Result$ = Result$ + Chr$( ReadByte( Stream% ) )
Next

; Den eingelesenen String zurueckgeben
Return Result$
End Function

; ========================================
;
; ExistsFolder()
;

Function ExistsFolder( Folder$ )
; Gibt true zurueck, wenn der Ordner existiert
Return ReadDir( Folder$ )
End Function

; ========================================
;
; CreateFolders()
;

Function CreateFolders( ExtractPath$ )
; Existiert der "Root" Ordner?
If ( Not ExistsFolder( ExtractPath$ ) )

; wenn nicht, wird er angelegt
CreateDir( ExtractPath$ )
End If

; Alle Eintraege durchlaufen
For currEntry.CentralDirFileHeader_t = Each CentralDirFileHeader_t

; Wenn der Name ein "/" am Ende hat, handelt es sich um einen Ordner
If ( Mid( currEntry\FileName, Len( currEntry\FileName ), 1 ) = "/" ) Then

; Wenn der Ordner nicht schon existiert wird er angelegt
If ( Not ExistsFolder( currEntry\FileName ) )
CreateDir( ExtractPath$ + "\" + currEntry\FileName )
End If
End If
Next
End Function


; ========================================
;
; SaveUncompressedData
;

Function SaveUncompressedData( FileName$, Stream%, Length% )
; Laenge groesser als 0???
If ( Not Length% ) Return

; Outputstream erzeugen
OutStream% = WriteFile( FileName$ )

; Fehler beim anlegen der Datei?
If ( Not OutStream% ) Return

; Auslesen/Schereiben der Daten
For i = 0 To Length%-1
WriteByte( OutStream%, ReadByte( Stream% ) ) ; schneller mit banks??
Next

; Outputstream schliessen
CloseFile( OutStream% )
End Function

; ========================================
;
; ReadZIPFooter
;

Function ReadZIPFooter.CentralDirEnd_t( Stream%, Size% )
; Neues Objekt erstellen
Local ZipFooter.CentralDirEnd_t = New CentralDirEnd_t

; Ist ueberhaupt eine Datei geoeffnet??
If ( Not Stream ) Return

; Position auf das vorletzte Byte im Stream setzen
Pos% = Size% -1
SeekFile( Stream%, Pos% )

; Suchen des ZIP Footers
While ( True )
; vier Bytes einlesen
Val% = ReadInt( Stream% )

; ist der eingelesene Wert ungleich der ZIP Footer Signatur?
If ( Val% <> SIG_CENTRALDIREND ) Then
; Dateizeiger um eins verringern
Pos% = Pos% - 1
SeekFile( Stream%, Pos% )
Else
; Dateizeiger vier Byte nach hinten setzen
SeekFile( Stream%, Pos% )
Exit
End If
Wend

; Einlesen der ZIP Footer Daten
ZipFooter\Signature = ReadInt( Stream% )
ZipFooter\DiskNumber = ReadShort( Stream% )
ZipFooter\CentralDirDisk = ReadShort( Stream% )
ZipFooter\NumEntry = ReadShort( Stream% )
ZipFooter\TotalNumEntry = ReadShort( Stream% )
ZipFooter\CentralDirSize = ReadInt( Stream% )
ZipFooter\CentralDirOffset = ReadInt( Stream% )
ZipFooter\CommentLength = ReadShort( Stream )
ZipFooter\Comment$ = ReadZipString( Stream%, ZipFooter\CommentLength )

; ZIP Footer Objekt zurueckgeben
Return ZipFooter
End Function

; ========================================
;
; ReadCentralDir
;

Function ReadCentralDir( Stream%, CentralDirEnd.CentralDirEnd_t )
; Ist ein Stream geoeffnet???
If ( Not Stream% ) Return

; Dateizeiger auf das erste Byte vor dem Central Directory setzen
SeekFile( Stream%, CentralDirEnd\CentralDirOffset )

; Einlesen der Datei-Header
For i = 0 To CentralDirEnd\NumEntry-1

; Neues Objekt erstellen
newEntry.CentralDirFileHeader_t = New CentralDirFileHeader_t

; Lesen der Daten in das neu erstellte Objekt
newEntry\Signature = ReadInt( Stream% )
newEntry\MadeByVer = ReadShort( Stream% )
newEntry\ExtractVer = ReadShort( Stream% )
newEntry\BitFlag = ReadShort( Stream% )
newEntry\Compression = ReadShort( Stream% )
newEntry\LastModTime = ReadShort( Stream% )
newEntry\LastModDate = ReadShort( Stream% )
newEntry\CRC32 = ReadInt( Stream% )
newEntry\CompressedSize = ReadInt( Stream% )
newEntry\UncompressedSize = ReadInt( Stream% )
newEntry\FileNameLength = ReadShort( Stream% )
newEntry\ExtraFieldLength = ReadShort( Stream% )
newEntry\FileCommentLength = ReadShort( Stream% )
newEntry\DiskNumberStart = ReadShort( Stream% )
newEntry\InternalAttr = ReadShort( Stream% )
newEntry\ExternalAttr = ReadInt( Stream% )
newEntry\Offset = ReadInt( Stream% )
newEntry\FileName$ = ReadZipString( Stream%, newEntry\FileNameLength )
newEntry\ExtraField$ = ReadZipString( Stream%, newEntry\ExtraFieldLength )
newEntry\FileComment$ = ReadZipString( Stream%, newEntry\FileCommentLength )
Next
End Function

; ========================================
;
; ExtractFiles
;

Function ExtractFiles( Stream% )
; Neues Objekt erstellen
Local FileHeader.LocalFileHeader_t = New LocalFileHeader_t

; Stream noch offen??
If ( Not Stream% ) Return

; Alle Eintraege druchlaufen
For currEntry.CentralDirFileHeader_t = Each CentralDirFileHeader_t

; Offset der Datei suchen
SeekFile( Stream%, currEntry\Offset )

; Daten lesen
FileHeader\Signature = ReadInt( Stream% )
FileHeader\ExtractVer = ReadShort( Stream% )
FileHeader\BitFlag = ReadShort( Stream% )
FileHeader\Compression = ReadShort( Stream% )
FileHeader\LastModTime = ReadShort( Stream% )
FileHeader\LastModDate = ReadShort( Stream% )
FileHeader\CRC32 = ReadInt( Stream% )
FileHeader\CompressedSize = ReadInt( Stream% )
FileHeader\UncompressedSize = ReadInt( Stream% )
FileHeader\FileNameLength = ReadShort( Stream% )
FileHeader\ExtraFieldLength = ReadShort( Stream% )
FileHeader\FileName = ReadZipString( Stream%, FileHeader\FileNameLength )
FileHeader\ExtraField = ReadZipString( Stream%, FileHeader\ExtraFieldLength )

; Dateidescriptor ueberspringen, ggf. fuer CRC check verwenden
; !!TODO: Ungetestet...
If ( FileHeader\BitFlag And $00f00000 ) Then
SeekFile( Stream%, FilePos( Stream% ) + 12 )
End If

; Sind die Daten unkomprimiert?
If ( FileHeader\Compression = 0 ) Then

; Speichern der Datei...
SaveUncompressedData( "tmp/" + FileHeader\FileName, Stream%, FileHeader\CompressedSize )
Else
DebugLog( "Keine komprimierten Daten unterstuetzt" )
End If
Next
End Function


grüße
http://bl4ckd0g.funpic.de
  • Zuletzt bearbeitet von David am Fr, Okt 15, 2004 7:49, insgesamt einmal bearbeitet

Vertex

BeitragFr, Okt 15, 2004 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Gute Arbeit!

Ich habe hier nochmal mein alten Code herausgekramt für *.cab Dateien:
Zitat:
.lib "advpack.dll"
ExtractFiles%(pszCabName$,pszExpandDir$,dwFlags,pszFileList$,lpReserved,dwReserved) : "ExtractFiles"


BlitzBasic: [AUSKLAPPEN]
; ------------------------------------------------------------------------- 
AppTitle "Cabinetfile reader"
Graphics 640,480,32,2
SetBuffer FrontBuffer()

File$ = "Compressed.cab"
DestinationDir$ = CurrentDir$()
; -------------------------------------------------------------------------

; -------------------------------------------------------------------------
Const CAB_FLAG_HASRESERVE = $0004

Const CAB_ATTRIB_READONLY = $0001
Const CAB_ATTRIB_HIDDEN = $0002
Const CAB_ATTRIB_SYSTEM = $0004
Const CAB_ATTRIB_VOLUME = $0008
Const CAB_ATTRIB_DIRECTORY = $0010
Const CAB_ATTRIB_ARCHIVE = $0020
; -------------------------------------------------------------------------

; -------------------------------------------------------------------------
Type CAB_Header_T
Field Signature
Field CheckSum
Field FileSize
Field FolderCheckSum
Field FirstEntryOffset
Field FilesCheckSum
Field Version
Field FolderCount
Field FileCount
Field Flags
Field SetID
Field iCabinet
End Type

Type CAB_Folder_T
Field DataFolderOffSet
Field CFData
Field CompressionType
End Type

Type CAB_Entry_T
Field FileSize
Field FileOffSetAfterDecompression
Field FileControlID
Field FileDate
Field FileTime
Field FileAttributes
Field Name$
End Type
; -------------------------------------------------------------------------

; -------------------------------------------------------------------------
Stream = ReadFile(File$)
CAB_Header.CAB_Header_T = New CAB_Header_T
CAB_Header\Signature = ReadInt(Stream)
CAB_Header\CheckSum = ReadInt(Stream)
CAB_Header\FileSize = ReadInt(Stream)
CAB_Header\FolderCheckSum = ReadInt(Stream)
CAB_Header\FirstEntryOffset = ReadInt(Stream)
CAB_Header\FilesCheckSum = ReadInt(Stream)
CAB_Header\Version = ReadShort(Stream)
CAB_Header\FolderCount = ReadShort(Stream)
CAB_Header\FileCount = ReadShort(Stream)
CAB_Header\Flags = ReadShort(Stream)
CAB_Header\SetID = ReadShort(Stream)
CAB_Header\iCabinet = ReadShort(Stream)

If CAB_Header\Flags = CAB_FLAG_HASRESERVE Then
SeekFile(Stream,FilePos(Stream) + ReadInt(Stream))
EndIf

For I = 1 To CAB_Header\FolderCount
CAB_Folder.CAB_Folder_T = New CAB_Folder_T
CAB_Folder\DataFolderOffSet = ReadInt(Stream)
CAB_Folder\CFData = ReadShort(Stream)
CAB_Folder\CompressionType = ReadShort(Stream)
Next

SeekFile(Stream,CAB_Header\FirstEntryOffSet)
For I = 1 To CAB_Header\FileCount
CAB_Entry.CAB_Entry_T = New CAB_Entry_T
CAB_Entry\FileSize = ReadInt(Stream)
CAB_Entry\FileOffSetAfterDecompression = ReadInt(Stream)
CAB_Entry\FileControlID = ReadShort(Stream)
CAB_Entry\FileDate = ReadShort(Stream)
CAB_Entry\FileTime = ReadShort(Stream)
CAB_Entry\FileAttributes = ReadShort(Stream)

While True
Char = ReadByte(Stream)
If Char = 0 Then Exit
CAB_Entry\Name$ = CAB_Entry\Name$ + Chr$(Char)
Wend
Next
CloseFile Stream
; -------------------------------------------------------------------------

; -------------------------------------------------------------------------
For CAB_Entry.CAB_Entry_T = Each CAB_Entry_T
Print "Name: " + CAB_Entry\Name$
Print "Date: " + CAB_Entry\FileDate
Print "Time: " + CAB_Entry\FileTime
Print "Attributes: " + FormatAttribute$(CAB_Entry\FileAttributes)

Result = ExtractFiles(File$,DestinationDir$,0,CAB_Entry\Name$,0,0)
If Result Then
Print "Decompressed: Error"
Else
Print "Decompressed: OK"
EndIf

Print
Next
; -------------------------------------------------------------------------

; -------------------------------------------------------------------------
Function FormatAttribute$(Attribute)
Select Attribute
Case CAB_ATTRIB_READONLY
Return "Read only"

Case CAB_ATTRIB_HIDDEN
Return "Hidden"

Case CAB_ATTRIB_SYSTEM
Return "System"

Case CAB_ATTRIB_VOLUME
Return "Volume"

Case CAB_ATTRIB_DIRECTORY
Return "Directory"

Case CAB_ATTRIB_ARCHIVE
Return "Archive"

Default
Return "Unknown"
End Select
End Function
; -------------------------------------------------------------------------

mfg olli
vertex.dreamfall.at | GitHub
 

David

BeitragFr, Okt 15, 2004 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Danke! Smile
Jetzt die anderen, wo bleiben rar, gz und der ganze Rest?? Wink

Dekompression lass ich bei meinem Code jetzt erstmal weg, da mir mein "richtiges" Projekt momentan wichtiger ist... Der Code ist ja quasi ein abgespeckter Port von meiner C++ ZipLib! Smile
Aber vielleicht find ich ja doch noch irgendwann genug Zeit für Huffmann & CO. Wink

grüße
http://bl4ckd0g.funpic.de

soli

BeitragFr, Okt 15, 2004 4:08
Antworten mit Zitat
Benutzer-Profile anzeigen
nur zur Info,
auf Blitzcoder gibt es eine funktionirende dll
für zip-Archive.

aber mach nur weiter,
ist interessant und vielleicht
wird das Ergebnis komfortabler.
solitaire
 

David

BeitragFr, Okt 15, 2004 7:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ja, ich hab mir schon gedacht, das es da diverse Dll's gibt.
Aber der Code soll vorrangig die Grundlagen des ZIP-Formats vermitteln.
Wer natürlich Verwendung findet, kann den Code gern nutzen.

grüße
http://bl4ckd0g.funpic.de

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group