Suche Quellcode .BINI <--> .INI

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
theo
Beiträge: 9859
Registriert: Mo 11. Sep 2006, 19:01

Re: Suche Quellcode .BINI <--> .INI

Beitrag von theo »

PascalDragon hat recht, die ersten Schritte kannst du direkt so in die Records lesen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Ms:TMemoryStream;
  bini_header:Tbini_header;
begin
  Ms:=TMemoryStream.Create;
  Ms.LoadFromFile('test.bini');
  Ms.ReadBuffer(bini_header,SizeOf(Tbini_header));
  if (bini_header.magic <> $494e4942) then ShowMessage('Not a Bini File');
  Memo1.lines.add(IntToHex(bini_header.magic));
  Memo1.lines.add(IntToStr(bini_header.version));
  Memo1.lines.add(IntToStr(bini_header.stroff));
etc...  
  Ms.free;
end;
ReadAnsiString ist hier nicht passend.

Wie es dann weiter geht, würde ich in "unbini.c" nachschlagen.
Ein funktionierender, überschaubarer C-Code ist mir lieber als 1000 Seiten Doku. :wink:

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Suche Quellcode .BINI <--> .INI

Beitrag von Lorca »

Hi all :)

SRY, der HEX Editor bringt mir leider nichts.
Ich benötige die Position des jeweiligen Zeichens im Stream in dezimaler Schreibform. Das leistet dieser Hexeditor leider nicht.
Das mit dem Stream READ habe ich gerade auch herausgefunden :(
Jeder String in der Datei endet mit einem NULL (#0). Habe mir dazu eine eigene Routine gebaut (mittels Read :) ) und lese bis zum NULL

Dennoch benötige ich noch immer einen Editor der mir die Position im String in Dezimalform anzeigt.
Das Problem ich jongliere sowohl mit der Stream Position als auch mit einem Offset zum lesen der Strings. Und bei den Offsets erhalte ich manches mal abstruse Werte, die ich überprüfen muss.



Gruß
Lorca

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Suche Quellcode .BINI <--> .INI

Beitrag von Lorca »

Hallo zusammen, :)

habe gerade den Editor "Notepad ++" gefunden.
Dieser leistet das was ich benötige.

Sollte Interesse bestehen, wie so eine BINI Datei aussehen kann, habe ich hier einmal die BINI und die unverschlüsselte INI Datei hochgeladen
BINI_INI_Dateien.zip
(36.82 KiB) 20-mal heruntergeladen

Gruß
Lorca

Benutzeravatar
theo
Beiträge: 9859
Registriert: Mo 11. Sep 2006, 19:01

Re: Suche Quellcode .BINI <--> .INI

Beitrag von theo »

Lorca hat geschrieben:
Mo 7. Nov 2022, 08:30
habe ich hier einmal die BINI und die unverschlüsselte INI Datei hochgeladen
Bini ist keine Verschlüsselung, die Texte liegen lesbar da drin.
Nur damit keine Missverständnisse aufkommen.
Lorca hat geschrieben:
Sa 5. Nov 2022, 09:54
PS: Ja ich kenne BINI.EXE und UNBINI.EXE Nuzt mir aber nichts. Allein der QuellCode hilft
Warum eigentlich nicht?
Ich würde es genau so machen. Von Lazarus aus unbini aufrufen.

Beispiel für Linux mit meinen Pfaden

Code: Alles auswählen

uses process;
...
procedure TForm1.Button1Click(Sender: TObject);
const
  BUF_SIZE = 2048;
var
  AProcess: TProcess;
  OutputStream: TStream;
  BytesRead: longint;
  Buffer: array[1..BUF_SIZE] of byte;
begin
  AProcess := TProcess.Create(nil);
  AProcess.Executable := '/home/theo/Install/binitools-master/unbini';
  AProcess.Parameters.Add('/home/theo/Install/binitools-master/test.bini');
  AProcess.Options := [poUsePipes];
  AProcess.Execute;
  OutputStream := TMemoryStream.Create;
  repeat
    BytesRead := AProcess.Output.Read(Buffer, BUF_SIZE);
    OutputStream.Write(Buffer, BytesRead)
  until BytesRead = 0;
  AProcess.Free;
  OutputStream.Position := 0;
  Memo1.Lines.LoadFromStream(OutputStream);
  OutputStream.Free;
end; 

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Suche Quellcode .BINI <--> .INI

Beitrag von Lorca »

Hi theo, :D

du bist echt schon eine coole socke 8)
Danke schön. Echt klasse.

Dennoch habe ich mich nun in dieser "Entschlüsselung" derart festgefressen, das ich dieses Problem lösen möchte oder
zumindest verstehen wo ich meine Fehler mache. Deine Lösung ist echt geil :)

Derzeit habe ich noch Schwierigkeiten bei den Integer Values (LODranges = 0, 50)
Das Schlüsselwort erwische ich zwar, aber bei den o.g. Values geht es auf die Bretter.
Irgendwie scheine ich Probleme beim SEEK zu haben. Die ersten drei Schlüsselworte haben String Values. Dennoch lese ich den Typ 1

Ich habe mal das Programm angehängt. Es ist ganz einfach gestrickt. Keine Klassen, nur Funktionen.
BINI_Convert.zip
(127.25 KiB) 20-mal heruntergeladen

Gruß
Lorca

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Suche Quellcode .BINI <--> .INI

Beitrag von Lorca »

Hi all, :)

folgende Informationen.

Die Beschreibung auf GitHub scheint für den Bereich des Varianten Records nicht korrekt zu sein. (s.U.)
Gehe ich mit einer 32 BIT Variable(Double) dran, bekomme ich im folgenden Schlüsselwort einen Versatz
Bei einem Single habe ich keinen Versatz.
Allerdings bekomme ich nicht den korrekten Wert geliefert.
Ich erhalte den Wert 4 . Es sollte jedoch der Wert: 100.000000 sein.

Kann mir jemand sagen wie ich eine Realzahl aus einem TFileStream lesen kann?
Es gibt keine Methode ReadFloat. Daher lese ich mit READ( buffer, sizeOF( Buffer ) ).
Leider erhalte ich jedoch nicht den korrekten wert.

Kann jemand helfen ?

Gruß
Lorca

Beschreibung im GitHub;
struct bini_value {
uint8_t type;
union {
int32_t i32;
float f32; <-- Hier wird die Größe eines Singles benötigt. Also 16 BIT
uint16_t string; /* string table offset */
} value;

Socke
Lazarusforum e. V.
Beiträge: 3098
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Suche Quellcode .BINI <--> .INI

Beitrag von Socke »

Lorca hat geschrieben:
Mo 7. Nov 2022, 15:23
Hier wird die Größe eines Singles benötigt. Also 16 BIT
Ein Single ist auch unter c 32 Bit lang. Ein Double ist auch dort 64 Bit lang. Aus der Namensgebung "f32" würde ich tatsächlich auf einen 32-Bit-Fließkommawert schließen.
Wenn da tatsächlich nur 16 Bit abgelegt werden, musst du diesen Datentyp selbst implementieren. Free Pascal bringt keinen passenden Typen mit. Du kannst natürlich erst einmal 16 Bit (Word) einlesen und im Debugger nachschauen, ob dort die richtigen Daten enthalten sind (vielleicht Half-precision_floating-point_format - ansonsten sind 16 Bit Demzimalzahlen wenig standardisiert).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Suche Quellcode .BINI <--> .INI

Beitrag von Lorca »

Hallo zusammen, :D

dank eurer tollen Hilfestellungen ist es mir nun gelungen den BINI Converter fertig zu stellen.
Ich habe keine Ahnung warum es mit den Float Werten zu Anfang nicht gefunzt hat. Nachdem ich mehrere Dinge versucht habe (Byte Arrays ... ) und dann wieder auf Single gegangen bin hat es nun geklappt.

Sollte es irgend jemand geben, der dieses Coding habe möchte, habe ich es in der sauberen und aktuellen Version noch einmal angehängt.
Ich denke das bin ich euch schuldig :) Wichtig: Es ist eine klassische Pascal Entwicklung. Also keine Klasse, nur Funktionen und eine davon im Interface deklariert.
BINI_Convert.zip
(146.28 KiB) 20-mal heruntergeladen

Gruß und Danke für eure Hilfe :)
Lorca

Benutzeravatar
theo
Beiträge: 9859
Registriert: Mo 11. Sep 2006, 19:01

Re: Suche Quellcode .BINI <--> .INI

Beitrag von theo »

Funzt sogar auf Linux. :D
Wenn ich jetzt noch wüsste, wozu ich das gebrauchen kann... :wink:

Antworten