Entwickler-Ecke

Off Topic - Portierung von VB.NET nach delphi


huhn - Fr 08.05.15 17:51
Titel: Portierung von VB.NET nach delphi
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:

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:

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?


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


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


mandras - Fr 08.05.15 19:33

Könntest Du evtl. einmal zB das erste Kilobyte einer solchen Datei hier hochladen?


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


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


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