Binärdatei Felder vom Hexdump interpretieren

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
lazagui
Beiträge: 6
Registriert: Mi 11. Feb 2015, 00:07

Binärdatei Felder vom Hexdump interpretieren

Beitrag von lazagui »

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 :-)
Dateianhänge
Bildschirmfoto_2018-11-01_10-51-25.jpg

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Binärdatei Felder vom Hexdump interpretieren

Beitrag von siro »

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 :wink:
https://www.lazarusforum.de/viewtopic.p ... mobile=off

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
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

Beitrag von Mathias »

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

lazagui
Beiträge: 6
Registriert: Mi 11. Feb 2015, 00:07

Re: Binärdatei Felder vom Hexdump interpretieren

Beitrag von lazagui »

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 :D :D :D .
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. :D :D :D

Gruß Mike

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Binärdatei Felder vom Hexdump interpretieren

Beitrag von siro »

Ich würde das wahrscheinlich so angehen:

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

lazagui
Beiträge: 6
Registriert: Mi 11. Feb 2015, 00:07

Re: Binärdatei Felder vom Hexdump interpretieren

Beitrag von lazagui »

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

Antworten