Eigenes Dateiformat
Eigenes Dateiformat
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.
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.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
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
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Ja, ist schon richtig. Die länge der Endung zählt ja mit zum Dateinamen,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?
somit wären 200 Zeichen wohl eher nicht zu empfehlen

4 - 6 Zeichen sollte ausreichen.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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:
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)
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
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
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Ich speichere nur für einen Namen bestimmte Werte(von einem Spiel)jojo1541 hat geschrieben:Willst du viele Namen mit dazugehörigem Alter speichern, oder nur einen/wenige Namen?
Ok, ich nehm dann mal 4. Thxts-soft hat geschrieben:Ja, ist schon richtig. Die länge der Endung zählt ja mit zum Dateinamen,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?
somit wären 200 Zeichen wohl eher nicht zu empfehlen![]()
4 - 6 Zeichen sollte ausreichen.
Gruß
Thomas
Ich blick da nicht so ganz durch...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:
...

Kannst du mir ein Tutorial empfehlen? Ich will ja auch keine Bilder oder so speichern sondern nur ein paar Daten...