Autor |
Beitrag |
huhn
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Fr 08.05.15 17:51
Hi forum,
ich versuche gerade VB.NET code zu delphi zu exportieren. Hierbei geht es um das auslesen einer Datenbank.
hier der codeausschnitt in VB.NET:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| brResIdx.BaseStream.Seek(12L, SeekOrigin.Begin) intBlockOffset = brResIdx.ReadInt32() brResIdx.BaseStream.Seek(184L, SeekOrigin.Begin) intDataFileSize = brResIdx.ReadInt32() brResIdx.BaseStream.Seek(72L, SeekOrigin.Begin) intFirstBlock = brResIdx.ReadInt32() brResIdx.BaseStream.Seek(intFirstBlock, SeekOrigin.Begin) Do While intForwardLink > 0 intForwardLink = brResIdx.ReadUInt32() brResIdx.ReadInt32() intActiveEntry = brResIdx.ReadInt16() brResIdx.ReadBytes(8) brResIdx.ReadBytes(10) Do While intActiveEntry <> 0 ' *NEW* read additional 4 bytes as high Long intROffset2 = brResIdx.ReadUInt32() intROffset = brResIdx.ReadUInt32() ' *NEW* recombine into a 64 bit offset intROffset64 = intROffset2 * (2 ^ 32) + intROffset intRType = Me.SwapEndian(brResIdx.ReadInt32()) ' skip next brResIdx.ReadInt32() If (intRType = lngRecType) Then hdr = ReadDataFile(34, intDataFileSize, intBlockOffset, intROffset) intDataSize = BitConverter.ToInt32(hdr, 18) - 12 If intDataSize > 0 And intDataSize < 10000 Then bwOutput.Write(ReadDataFile(intDataSize, intDataFileSize, intBlockOffset, intROffset + 10)) 'swDbgOutput.WriteLine("At Offset " & CStr(intROffset + 10) & " : " & intDataSize & " bytes") 'swDbgOutput.Flush() intNumRecords = intNumRecords + 1 End If End If intActiveEntry = intActiveEntry - 1 Loop brResIdx.BaseStream.Seek(intForwardLink, SeekOrigin.Begin) Loop |
und mein bisher übersetztes:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| function TAOExtractor.readdb:string; var intBlockOffset, intDataFileSize, intFirstBlock: int32; intActiveEntry: int32; intForwardLink: UInt32; fs: TFileStream; buffer: array [0..1024] of char; begin try aopath:='C:\Funcom\Anarchy Online'; fs:=TFileStream.Create(aopath+dbpath+'ResourceDatabase.dat.001', fmOpenRead); fs.Seek(12,soFromBeginning); fs.Read(intBlockOffset, 4); fs.Seek(184,soFromBeginning); fs.Read(intDataFileSize, 4); fs.Seek(72,soFromBeginning); fs.Read(intFirstBlock, 4); fs.Seek(intFirstBlock,soFromBeginning); While intForwardLink > 0 do begin intForwardLink:=fs.ReadWord; fs.ReadBuffer(buffer,4); fs.ReadBuffer(intActiveEntry,2); fs.ReadBuffer(buffer,18); showmessage('test'+inttostr(intActiveEntry)); While intActiveEntry <> 0 do begin end;
end; finally fs.Free; end; end; |
Leider bekomme ich für intFirstblock -1 raus, was nicht passt. Hab ich einen Fehler bei der exportierung gemacht?
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
Zuletzt bearbeitet von huhn am Fr 08.05.15 19:01, insgesamt 1-mal bearbeitet
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 08.05.15 18:11
Hallo,
ein paar Anmerkungen:
- mit C++ hat der Code nur wenig zu tun
- der Code ist wohl eher VB.NET (aber ähnlich zu C#)
Editiere mal deinen Beitrag + Titel...
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 08.05.15 18:11
Entweder ist das eine Makrokatastrophe oder nicht C++.
Meine Delphi Kenntnisse halten sich in Grenzen und der ~C++~ Teil ist sicher nicht vollständig. Aber sollte intForwardLink nicht vor der Schleife irgendwie initialisiert werden?
Haben die Quellsprache und Delphi die gleiche Vorstellung der ByteOrder beim Lesen und interpretieren als int?
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Fr 08.05.15 18:14
Hallo,
1. Warum ist das unter Off Topic!? Hat doch mit Programmieren zu tuen?
2. Wie lange programmierst Du schon? Der Quelltext hat da nen paar Schnitzer drinne...
3. Bist du dir sicher das du überhaut eine datei aufmachst oder das die datei daten enthält?
Lies die Datei, oder eben zumnidest den Anfang, Byteweise aus, wandel die Bytes in Dezimal- oder Hex-string um und zeige sie in einem Memo an. Dann kannst Du sehen ob Du zumindest auf dem richtigen Weg bist.
PS: try finally macht nur Sinn wenn man das Objekt dessen Speicherbereich man "beschützen" will, vor try erstellt.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
huhn 
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Fr 08.05.15 19:31
ist ne weile her das ich programiert habe. Ja da hast du recht mit dem try finally, hab ich korrigiert.
Geladen wurde die Datei (~1gb).
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Fr 08.05.15 19:33
Könntest Du evtl. einmal zB das erste Kilobyte einer solchen Datei hier hochladen?
|
|
huhn 
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Fr 08.05.15 20:29
Das mitm einlesen funktioniert, nur hab ich wohl nicht die richtigen stellen. Hab einen komplette Sourcecode von einem anderen, auch in VB.NET geschriebenen Programmes.
Ich werd mich wohl durch den Code durchwühlen müssen. Ich danke euch für die Hilfe und im Anhang hab ich 1MB Auszug aus der DB.
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
Zuletzt bearbeitet von huhn am Fr 08.05.15 22:07, insgesamt 1-mal bearbeitet
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 08.05.15 20:35
Nur damit hier keiner Phantome jagt du weißt das dieses VB.Net Programm auch funktioniert?
Nebenbei ist das ein Auszug einer Programmdatei von Anarchy Online die von diesem mit deployed wurde oder sind das Daten die von Anarchy Online bei dir lokal erstellt wurden? Im ersten Fall könntest du gerade gegen Lizenzbestimmungen verstoßen und solltest die Datei wieder off nehmen.
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Fr 08.05.15 21:48
> ist das ein Auszug einer Programmdatei von Anarchy Online
wohl eher eine Datendatei davon.
Bei mir wird intFirstblock mit dem Wert belegt, der in der Datei dort auch steht (getestet mit D6).
Ob das ganze aber im sinne des Erfinders ist bezweifle ich:
Ab Pos. 72 der Datei steht 74 56 51 83 hex. (Als Int: -2091821452 oder als UINT 2203145844)
Da die Datei nur 1GB groß ist kann dies keine korrekte Positionsangabe in der Datei sein.
|
|
huhn 
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Fr 08.05.15 22:06
Genau das hab ich gemeint^^ bei mir kam das selbe raus. Ja das ist ein Bruchstück von der AOdatabase, werd ich wohl vorsichtshalber wieder rausnehmen.
@Ralf: Ja das Programm läuft und funktioniert tadellos, läuft bei mir im Hintergrund.
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Fr 08.05.15 23:46
Wenn bei Dir das gleiche herauskam, warum schreibst Du das nicht?
> Leider bekomme ich für intFirstblock -1 raus
Darauf habe ich gesucht
Hättest Du geschrieben daß 2203145844 in der Variablen gespeichert wird hätte ich mir manches sparen können.
Dann wäre ich nämlich direkt zu dem Teil gekommen:
"Da die Datei nur 1GB groß ist kann dies keine korrekte Positionsangabe in der Datei sein."
|
|