Eigenes Dateiformat

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Eigenes Dateiformat

Beitrag 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.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Beitrag 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..
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Dafür empfehle ich Datenbanken wie MySQL, welche von PB nativ unterstützt werden. allerdings musst du dich evtl. in MySQL einarbeiten
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
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

Beitrag 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
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.
Bild
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Beitrag 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?
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Willst du viele Namen mit dazugehörigem Alter speichern, oder nur einen/wenige Namen?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
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

Beitrag 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 :mrgreen:

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.
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Beitrag 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 :mrgreen:

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...
Antworten