Autor Beitrag
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: 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:
ausblenden volle Höhe C#-Quelltext
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()
    //skip BackLink
    brResIdx.ReadInt32()
    intActiveEntry = brResIdx.ReadInt16()
    //skip 8 bytes of unknown
    brResIdx.ReadBytes(8)
    //*NEW* skip further 10 bytes of unknown
    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:
ausblenden volle Höhe Delphi-Quelltext
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;
    //intActiveEntry: int16;
    fs: TFileStream;
    buffer: array [0..1024of char;
begin
    try
      aopath:='C:\Funcom\Anarchy Online';
      fs:=TFileStream.Create(aopath+dbpath+'ResourceDatabase.dat.001', fmOpenRead);
      //Read Header
      fs.Seek(12,soFromBeginning);
        fs.Read(intBlockOffset, 4);
        //intBlockOffset:=fs.ReadDWord;
      fs.Seek(184,soFromBeginning);
        fs.Read(intDataFileSize, 4);
        //intDataFileSize:=fs.ReadDWord;
      fs.Seek(72,soFromBeginning);
        fs.Read(intFirstBlock, 4); //sizeof(intFirstBlock)
        //intFirstBlock:=fs.ReadDWord;
      fs.Seek(intFirstBlock,soFromBeginning);
      While intForwardLink > 0 do
          begin
              intForwardLink:=fs.ReadWord;
              fs.ReadBuffer(buffer,4);
              fs.ReadBuffer(intActiveEntry,2);
              fs.ReadBuffer(buffer,18);
              //test
              showmessage('test'+inttostr(intActiveEntry));
              While intActiveEntry <> 0 do
                  begin
                  end;

          end;
      //result:=inttostr(intForwardLink);
      //fs.Read(intBlockOffset);
    finally
      fs.Free;
    end;
    //Read Header
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Fr 08.05.15 19:33 
Könntest Du evtl. einmal zB das erste Kilobyte einer solchen Datei hier hochladen?
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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."