Seite 1 von 2
Eigenes Dateiformat
Verfasst: 15.08.2009 18:58
von Codusa
Hallo,
Ich bin relativ neu in PB und will für mein Projekt ein eigenes Dateiformat erstellen(.saf),
immo hab ich die Dateieinfach .saf genannt und den Inhalt verschlüsselt.
Ich denke aber, dass dies nicht die elegantere Lösung ist und wollte deswegen gerne mal wissen,
wie man so etwas machen kann.
Verfasst: 15.08.2009 19:06
von jojo1541
naja, dass kommt ganz darauf an, was die Dateien beinhalten sollen...
Multimediafiles(bilder, sounds) oder programmspezifische dateien, wie z.b spezielle daten für das Spiel.
Verfasst: 15.08.2009 19:10
von Codusa
Also Ich hatte nur vor, da Daten drin zu speichern in der Form
"Name=Test"
"Alter=xy"
immo entschlüssel ich die Daten und lese Zeile für Zeile aus..
Verfasst: 15.08.2009 19:15
von jojo1541
Dafür empfehle ich Datenbanken wie MySQL, welche von PB nativ unterstützt werden. allerdings musst du dich evtl. in MySQL einarbeiten
Verfasst: 15.08.2009 19:16
von ts-soft
Das einzige Problem, das ich sehe ist die kurze Extension. 8.3 gilt ja schon
ewig nicht mehr und die 3 Buchstabenkombinationen sind ja so langsam alle
schon vergeben.
Solange Du die Extension nicht mit Deinem Programm verknüpfst sollte
sowas wie: pref, prefs, ini oder auch bin, dat reichen.
Ansonsten besser was längeres um Probleme mit anderen Programmen zu
vermeiden.
Gruß
Thomas
Verfasst: 15.08.2009 19:22
von Codusa
@jojo1541
Da blick ich nicht ganz durch, ich glaub da bleib ich lieber bei meiner Methode^^
@ts-soft
Also ist es so wie ich es jetzt mache im Grunde richtig? (abgesehen von 8.3)
und wie lang darf die Endung maximal sein?
Verfasst: 15.08.2009 19:36
von jojo1541
Willst du viele Namen mit dazugehörigem Alter speichern, oder nur einen/wenige Namen?
Verfasst: 15.08.2009 19:40
von ts-soft
Codusa hat geschrieben:@ts-soft
Also ist es so wie ich es jetzt mache im Grunde richtig? (abgesehen von 8.3)
und wie lang darf die Endung maximal sein?
Ja, ist schon richtig. Die länge der Endung zählt ja mit zum Dateinamen,
somit wären 200 Zeichen wohl eher nicht zu empfehlen
4 - 6 Zeichen sollte ausreichen.
Gruß
Thomas
Verfasst: 15.08.2009 19:46
von Thorium
Generell sollte man erstmal unterscheiden ob man ein binäres oder ASCII/Unicode Format erstellen möchte.
Dann sollte man sich Gedanken machen wie die Struktur des Formats aufgebaut sein sollte, damit sie alles enthält was man braucht und auch möglichst optimal zu nutzen ist.
Binärformate haben meist einen Header am Anfang der Datei, der Informationen über die in der Datei gespeicherten Daten enthält. Bei Bildern z.B. die Breite, Höhe, Farbtiefe. Oder auch ob die Daten komprimiert sind und mit welcher Kompression.
Wichtig bei Binärformaten ist es eine Signatur oder auch Magic genannt an den Anfang der Datei zu schreiben. Dadurch ist das Dateiformat unabhängig der Dateinamenserweiterung identifizierbar.
Ich entwickel sehr gerne eigene Dateiformate. Ist zwar oft nicht nötig aber macht mir einfach Spaß. Ich schreib mir dann immer erstmal genau auf wie das Dateiformat aufgebaut sein soll bevor ich irgendwas programmiere.
Mal 2 Beispiele:
Mein Sprite Format:
Extrem simples Format ohne Balast und ohne Kompression. Ist rein für Spiele gedacht und in Kombination mit einem Dateikontainer, der die Kompression stellt.
Code: Alles auswählen
ThorSpIm (Thorium Sprite Image) format structure
------
header
------
8 byte signature = ThorSpIm
1 byte format version = 1
2 byte width
2 byte height
----------
image data
----------
32bit per pixel (BGRA)
Mein Ressourcenkontainerformat:
Etwas komplexer. Im Prinzip ein Dateiarchivformat speziell für Spiele und zur Verwendung mit meinem Ressourceloader.
Code: Alles auswählen
;ThReCo (Thorium Ressource Container) format structure
;------
;header
;------
;6 byte signature = ThReCo
;1 byte format version = 1
;1 byte used compressions (flags)
;1 byte flags
;2 byte alignment
;1 byte compression of directory
;2 byte compressed size of directory (4 byte on huge file)
;2 byte uncompressed size of directory (4 byte on huge file)
;4 byte offset of directory (8 byte on huge file)
;---------
;directory
;---------
;2 byte count of ressources (4 byte on huge file)
;x byte ressource entries
;---------------
;ressource entry
;---------------
;1 byte lengh descriptor for ressource name
;x byte ressource name
;2 byte version of ressource
;1 byte compression
;1 byte count of language entries
;x byte language entries
;--------------
;language entry
;--------------
;1 byte language
;4 byte compressed size of ressource (8 byte on huge file)
;4 byte uncompressed size of ressource (8 byte on huge file)
;4 byte offset of ressource (8 byte on huge file)
;
;------------
;header flags
;------------
;bit0 = ressource versioning
;bit1 = multilingual
;bit2 = big file (file > 2GB)
;bit3 = huge file (file > 4GB)
;bit4 = unused
;bit5 = unused
;bit6 = unused
;bit7 = unused
;
;-----------------------
;compression enumaration
;-----------------------
;00 = none (uncompressed)
;01 = JCalG1
;02 = bzip2 (not used at the moment)
;03 = BriefLZ (not used at the moment)
;04 = zlib (not used at the moment)
;
;-----------------
;compression flags
;-----------------
;bit0 = JCalG1
;bit1 = bzip2 (not used at the moment)
;bit2 = BriefLZ (not used at the moment)
;bit3 = zlib (not used at the moment)
;bit4 = unused
;bit5 = unused
;bit6 = unused
;bit7 = unused
Mein Bildformat lese ich hiermit aus:
Code: Alles auswählen
#Tsi_Signature = $6D497053726F6854
Procedure GfxCatchTsi(TsiAddr.i)
Define.i X, Y , Sprite, Buffer, Pitch, PixelFormat, SourceAddr, SourceLineLen
Define *SourcePixel.Long
Define *DestPixel.Long
Define *Header.TsiHeader
*Header = TsiAddr
;check if file is a ThorSpIm
If *Header\Signature <> #Tsi_Signature
ProcedureReturn 0
EndIf
;check the format version of the ThorSpIm
If *Header\FormatVersion <> 1
ProcedureReturn 0
EndIf
;create empty sprite
Sprite = CreateSprite(#PB_Any, *Header\Width, *Header\Height, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
;if sprite can not be created, exit procedure
If Sprite = 0
ProcedureReturn 0
EndIf
;copy the image data to the sprite
StartDrawing(SpriteOutput(Sprite))
Buffer = DrawingBuffer()
Pitch = DrawingBufferPitch()
PixelFormat = DrawingBufferPixelFormat()
SourceAddr = TsiAddr + SizeOf(TsiHeader)
SourceLineLen = *Header\Width * 4
Select PixelFormat
Case #PB_PixelFormat_32Bits_BGR
;BGRA format, no conversion needed
If Pitch = SourceLineLen
;image data can be copied as hole
CopyMemory(SourceAddr, Buffer, SourceLineLen * *Header\Height)
Else
;image data have to be copied line by line
For Y = 0 To *Header\Height - 1
CopyMemory(SourceAddr + (SourceLineLen * Y), Buffer + (Pitch * Y), SourceLineLen)
Next
EndIf
Case #PB_PixelFormat_32Bits_RGB
;RGBA format, pixels need to be converted
*SourcePixel = SourceAddr
For Y = 0 To *Header\Height - 1
*DestPixel = Buffer + (Pitch * Y)
For X = 0 To *Header\Width - 1
*DestPixel\l = ABGR2ARGB(*SourcePixel\l)
*SourcePixel + 4
*DestPixel + 4
Next
Next
Default
;not supported pixel format, exit procedure
FreeSprite(Sprite)
ProcedureReturn 0
EndSelect
StopDrawing()
ProcedureReturn Sprite
EndProcedure
Verfasst: 16.08.2009 10:59
von Codusa
jojo1541 hat geschrieben:Willst du viele Namen mit dazugehörigem Alter speichern, oder nur einen/wenige Namen?
Ich speichere nur für einen Namen bestimmte Werte(von einem Spiel)
ts-soft hat geschrieben:Codusa hat geschrieben:@ts-soft
Also ist es so wie ich es jetzt mache im Grunde richtig? (abgesehen von 8.3)
und wie lang darf die Endung maximal sein?
Ja, ist schon richtig. Die länge der Endung zählt ja mit zum Dateinamen,
somit wären 200 Zeichen wohl eher nicht zu empfehlen
4 - 6 Zeichen sollte ausreichen.
Gruß
Thomas
Ok, ich nehm dann mal 4. Thx
Thorium hat geschrieben:Generell sollte man erstmal unterscheiden ob man ein binäres oder ASCII/Unicode Format erstellen möchte.
Dann sollte man sich Gedanken machen wie die Struktur des Formats aufgebaut sein sollte, damit sie alles enthält was man braucht und auch möglichst optimal zu nutzen ist.
Binärformate haben meist einen Header am Anfang der Datei, der Informationen über die in der Datei gespeicherten Daten enthält. Bei Bildern z.B. die Breite, Höhe, Farbtiefe. Oder auch ob die Daten komprimiert sind und mit welcher Kompression.
Wichtig bei Binärformaten ist es eine Signatur oder auch Magic genannt an den Anfang der Datei zu schreiben. Dadurch ist das Dateiformat unabhängig der Dateinamenserweiterung identifizierbar.
Ich entwickel sehr gerne eigene Dateiformate. Ist zwar oft nicht nötig aber macht mir einfach Spaß. Ich schreib mir dann immer erstmal genau auf wie das Dateiformat aufgebaut sein soll bevor ich irgendwas programmiere.
Mal 2 Beispiele:
Mein Sprite Format:
Extrem simples Format ohne Balast und ohne Kompression. Ist rein für Spiele gedacht und in Kombination mit einem Dateikontainer, der die Kompression stellt.
...
Mein Ressourcenkontainerformat:
Etwas komplexer. Im Prinzip ein Dateiarchivformat speziell für Spiele und zur Verwendung mit meinem Ressourceloader.
...
Mein Bildformat lese ich hiermit aus:
...
Ich blick da nicht so ganz durch...
Kannst du mir ein Tutorial empfehlen? Ich will ja auch keine Bilder oder so speichern sondern nur ein paar Daten...