Hallo zusammen,
ich hoffe ich bin hier im richtigen Unterforum.
Ich habe eine binäre dtb-Datei die mit TurboPascal erstellt wurde (s. Hexdump im Anhang). Satzlänge ist 237 Bytes. Da sind binäre, double oder float Felder drin von denen ich die Werte ermitteln müsste. Kann mir jemand einen Tipp geben wo ich nachlesen kann wie ich diesen Hexdump interpretieren muss?
Gruß lazagui
P.S. Ich habe NATÜRLITSCH keine Doku der Datenstruktur
Binärdatei Felder vom Hexdump interpretieren
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Binärdatei Felder vom Hexdump interpretieren
Hallo,
ohne spezielles Wissen, zumindest wie viele Daten da drin versteckt sind, ist das natürlich ziemlich aussichtslos.
Zumindest erkennt man schon, dass es sich wohl tatächlich um Turbo-Pascal handeln könnte.
Das Wort Rechnung taucht ja als Ascii Kette auf.
Bei Turbo-Pascal befindet sich vor dem Text immer das Längenbyte.
Das ist hier ein 8 weil "Rechnung" 8 Buchtstaben hat.
Dann taucht dort "DM" auf, hier ist aber das vordere Byte eine 3.
Hier ist es aber möglich, dass der Datensatz 3 Buchstaben vorgesehen hat für die Währung.
Das ist natürlich alles nur reine Spekulation...
Das Hexzeichen "0A" ist ja eigentlich ein LineFeed, also ein Zeilenumbruch bei Texten.
Wenn man sich den Hexcode so anschaut, könnten diese Zeichen eventuell ein Feld beenden.
Mit Floats wird dann schwieriger,
Ein Float in Pascal war ja früher vom Typ Real
http://www.shikadi.net/moddingwiki/Turbo_Pascal_Real
später gabs dann Extended usw.
Word und Integer waren 16 Bit.
Normalerweise im Intelformat, das bedeutet zuerst das Low Byte und dann das High Byte.
Viel mehr kann ich Dir da auch nicht weiter helfen....
woher weisst Du denn das der Block 237 Byte groß ist ?
Hast Du das nicht schon vor 3 Jahren hier gefragt
https://www.lazarusforum.de/viewtopic.p ... mobile=off
Siro
ohne spezielles Wissen, zumindest wie viele Daten da drin versteckt sind, ist das natürlich ziemlich aussichtslos.
Zumindest erkennt man schon, dass es sich wohl tatächlich um Turbo-Pascal handeln könnte.
Das Wort Rechnung taucht ja als Ascii Kette auf.
Bei Turbo-Pascal befindet sich vor dem Text immer das Längenbyte.
Das ist hier ein 8 weil "Rechnung" 8 Buchtstaben hat.
Dann taucht dort "DM" auf, hier ist aber das vordere Byte eine 3.
Hier ist es aber möglich, dass der Datensatz 3 Buchstaben vorgesehen hat für die Währung.
Das ist natürlich alles nur reine Spekulation...
Das Hexzeichen "0A" ist ja eigentlich ein LineFeed, also ein Zeilenumbruch bei Texten.
Wenn man sich den Hexcode so anschaut, könnten diese Zeichen eventuell ein Feld beenden.
Mit Floats wird dann schwieriger,
Ein Float in Pascal war ja früher vom Typ Real
http://www.shikadi.net/moddingwiki/Turbo_Pascal_Real
später gabs dann Extended usw.
Word und Integer waren 16 Bit.
Normalerweise im Intelformat, das bedeutet zuerst das Low Byte und dann das High Byte.
Viel mehr kann ich Dir da auch nicht weiter helfen....
woher weisst Du denn das der Block 237 Byte groß ist ?
Hast Du das nicht schon vor 3 Jahren hier gefragt
https://www.lazarusforum.de/viewtopic.p ... mobile=off
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6210
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Binärdatei Felder vom Hexdump interpretieren
Ich habe eine binäre dtb-Datei die mit TurboPascal erstellt wurde
Hast du die alte Turbo-Pascal Source nicht mehr ?
Dann wäre es sehr einfach.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Binärdatei Felder vom Hexdump interpretieren
Hallo Mathias,
danke für Tipps. Wenn ich die Source hätte ( ja das wär schön), dann bräuchte ich hier nicht zu fragen .
Die Satzlänge kann man durch Auszählen der regelmäßig wiederkehrenden Felder ermitteln. Im Anhang hab ich nur mal einen einzelnen Beispielsatz kopiert. CR, Newline, also 0A0D und so was gibts für RECORDS nicht. Die sind ohne Trennzeichen aneinandergereiht. Es gibt [datei].dtb, [datei].idx und [datei].dia.
Ich versuch mal ob mit Low und High-Byte weiterkomme.
Und ja vor 3 jahren lag das Thema schon mal auf meinem Tisch.
Gruß Mike
danke für Tipps. Wenn ich die Source hätte ( ja das wär schön), dann bräuchte ich hier nicht zu fragen .
Die Satzlänge kann man durch Auszählen der regelmäßig wiederkehrenden Felder ermitteln. Im Anhang hab ich nur mal einen einzelnen Beispielsatz kopiert. CR, Newline, also 0A0D und so was gibts für RECORDS nicht. Die sind ohne Trennzeichen aneinandergereiht. Es gibt [datei].dtb, [datei].idx und [datei].dia.
Ich versuch mal ob mit Low und High-Byte weiterkomme.
Und ja vor 3 jahren lag das Thema schon mal auf meinem Tisch.
Gruß Mike
-
- Beiträge: 732
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Binärdatei Felder vom Hexdump interpretieren
Ich würde das wahrscheinlich so angehen:
Die Zeile
änderst Du nun z.b auf:
und schaust Die wieder die Werte an, ob es sinnvoll wird.
ebenso kannst Du das mit Floats oder was auch immer probieren:
.....
Writeln(FloatToStr(data.value)); // Wert anzeigen lassen
nach und nach fängst Du an die Struktur zu füllen, z.B. so:
Ist nur so eine Idee
Siro
Code: Alles auswählen
const BlockSize = 237; // Anzahl Bytes einse Datensatzes
// ein Variantenrecord:
Type TData = record
case BYTE of
0 : (all:array[0..BLOCKSIZE-1] of byte); // der gesamte Datenblock
1 : (pre:Array[0..10] of Byte; // Bytes die testweise übersprungen werden sollen
value : Integer); // ein Integer Wert, der evtl, hier liegen könnte
end;
var data:TData; // ein kompletter Datensatz wird immer eingelesen
procedure Auswerten;
var f:File;
var readed:Integer;
begin
AssignFile(f,'Test.dtb'); // Datei öffnen
Reset(f,1); // Datei auf Anfang setzen
Repeat // Wiederholt ausführen
BlockRead(f,data,BlockSize,readed); // ganzen Block einlesen
Writeln(IntToStr(data.value)); // Wert anzeigen lassen
Until readed = 0; // wiederholen bis keine Bytes mehr gelesen werden können
CloseFile(f); // Datei wieder schliessen
end;
Die Zeile
Code: Alles auswählen
1 : (pre:Array[0..10] of Byte; // Bytes die testweise übersprungen werden sollen
änderst Du nun z.b auf:
Code: Alles auswählen
1 : (pre:Array[0..11] of Byte; // so verschiebst Du es immer weiter,
und schaust Die wieder die Werte an, ob es sinnvoll wird.
ebenso kannst Du das mit Floats oder was auch immer probieren:
Code: Alles auswählen
Type TData = record
case BYTE of
0 : (all:array[0..BLOCKSIZE-1] of byte); // der gesamte Datenblock
1 : (pre:Array[0..10] of Byte; // Bytes die testweise übersprungen werden sollen
value : Real); // ein Float Wert, der evtl, hier liegen könnte
end;
.....
Writeln(FloatToStr(data.value)); // Wert anzeigen lassen
nach und nach fängst Du an die Struktur zu füllen, z.B. so:
Code: Alles auswählen
Type TData = record
case BYTE of
0 : (all:array[0..BLOCKSIZE-1] of byte); // der gesamte Datenblock
1 : (pre:Array[0..17] of Byte; // Bytes die übersprungen werden sollen
value : Integer; // hier steht vermutlich ein Integer
unknown_1 : array[0..7] of Byte; // hier sind noch unbekannte Daten 8 Bytes
Summe : real; // hier liegt wohlk ein Realwert
unknown_2 : array[0..4] of Byte); // noch ungeklärte Bytes
end;
Ist nur so eine Idee
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: Binärdatei Felder vom Hexdump interpretieren
Hallo Siro,
erstmal vielen Dank für die Vorlage und schönen Gruß nach Berlin. Da habich 12 Jahre in der Warschauer gewohnt:-)
Ich werd wohl mal Lazaruns installieren und mich da durchtanken.
Gruß Mike
erstmal vielen Dank für die Vorlage und schönen Gruß nach Berlin. Da habich 12 Jahre in der Warschauer gewohnt:-)
Ich werd wohl mal Lazaruns installieren und mich da durchtanken.
Gruß Mike