Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   VBA Script in Delphi umsetzen (https://www.delphipraxis.net/177872-vba-script-delphi-umsetzen.html)

BUllweih 3. Dez 2013 09:47

VBA Script in Delphi umsetzen
 
Hallo,
Da ich überhaupt keinen Plan von VBA habe wollte ich mal hier nachfragen
ob mir wer bei einem Übersetzungsproblem helfen kann.

Ich habe jetzt schon viele CRC32 Funtionen getestet aber ich bekomme nicht das Ergebnis das dieses Script generiert.
Aber genau diese Ausgabe brauche ich.

Ich bekomme den Code unten nicht übersetzt.
Könnte da wer mir mal etwas unter die Arme greifen ??

Danke
MfG
Michael
Code:
Function Skr_CRC32(Data As String) As String
Dim i, lCRC32, iBit
Dim Crc32Table()
 
  ReDim Crc32Table(255)
  For i = 0 To 255
      lCRC32 = i
      For iBit = 0 To 7
          If (lCRC32 And &H1) <> 0 Then
              lCRC32 = (((lCRC32 And &HFFFFFFFE) \ &H2) And &H7FFFFFFF) Xor &HEDB88320
          Else
              lCRC32 = ((lCRC32 And &HFFFFFFFE) \ &H2) And &H7FFFFFFF
          End If
      Next
      Crc32Table(i) = lCRC32
  Next
 
  lCRC32 = &HFFFFFFFF
  For i = 1 To Len(Data)
      lCRC32 = (((lCRC32 And &HFFFFFF00 \ &H100) And &HFFFFFF) Xor _
      Crc32Table((lCRC32 And &HFF) Xor AscW(Mid(Data, i, 1))))
  Next
  Skr_CRC32 = Hex(lCRC32 Xor &HFFFFFFFF)
End Function

himitsu 3. Dez 2013 09:57

AW: VBA Script in Delphi umsetzen
 
Du könntest ja gern auch mal schreiben, was du schon übersetzt hast.

Was macht
Delphi-Quellcode:
ReDim Crc32Table(255)
eigentlich?
Setzt das die Größe des Arrays auf 255, also 0 bis 254?
Wenn ja, dann hatte der Ooriginale Code schon einen netten Buffer-Overrun eingebaut.



.
Delphi-Quellcode:
/
entspricht wohl dem DIV?
Und was AscW und Mid macht, wüsste ich jetzt nicht auf Anhieb, bzw. was die Äquivalente in Delphi wären,
aber sonst sollte sich der Code doch problemlos 1:1 übersetzen lassen? (die Syntax usw. sind ja grundsätzlich fast gleich)
[edit] sieht nach Copy und Ord aus, bzw.
Delphi-Quellcode:
Ord(Data[i])

Ach ja, welche DelphiVersion eigentlich?
Ab D2009 mußt du AnsiString verwenden, da bei Unicode viele Zeichen einen anderen ordinalen Index besitzen. :angle2:

BUllweih 3. Dez 2013 10:03

AW: VBA Script in Delphi umsetzen
 
Hallo,
Wie schon gesagt habe ich von VBA keinen Plan.
Das Script ist in einer Touchpanelsoftware eingebaut.

Diese Software soll nun mit Delphi ersetzt werden.
Ich möchte das bestehende Benutzeranmeldungssystem beibehalten und in mein Delphiprojekt
integrieren.

Code:
ReDim Crc32Table(255)
Das ist laut Beschreibung die Speicherreservierung.

MfG

pustekuchen 3. Dez 2013 10:04

AW: VBA Script in Delphi umsetzen
 
Wirklich Ahnung von VBA Script braucht man ja auch nicht. Du musst nur CRC32 und Delphi verstehen und dann ist dieses Skript einfach zu übersetzten.

Wie sieht denn dein versuch aus?

himitsu 3. Dez 2013 10:06

AW: VBA Script in Delphi umsetzen
 
Ich hab oben noch bissl was dazu-editiert.

Zitat:

Zitat von BUllweih (Beitrag 1238322)
Code:
ReDim Crc32Table(255)
Das ist laut Beschreibung die Speicherreservierung.

Joar, aber scheinbar für 255 Einträge.
0..255 sind allerdings 256. (nja, das kannst du aber auch gleich als statisches Array deklarieren und brauchts kein SetLength)

DeddyH 3. Dez 2013 10:08

AW: VBA Script in Delphi umsetzen
 
Nachschauen hat noch nie geschadet. Aus http://msdn.microsoft.com/de-de/libr...=vs.90%29.aspx:
Zitat:

Arraygrenzen. Jeder Eintrag in boundlist kann die Unter- und Obergrenze der betreffenden Dimension angeben. Die Untergrenze ist immer 0 (null), unabhängig davon, ob Sie sie angeben. Die Obergrenze ist der höchste mögliche Wert für diesen Feldindex und nicht die Länge der Dimension (die durch die Obergrenze plus eins bestimmt wird). Jeder Feldindex kann zwischen 0 (null) und dem Wert seiner Obergrenze betragen.

himitsu 3. Dez 2013 10:11

AW: VBA Script in Delphi umsetzen
 
Bei
Delphi-Quellcode:
Hex
mußt du aufpassen, in welcher reihenfolge das Hex die Werte schreibt.
Links groß und rechts klein oder andersrum und zusätzlich könnte es auch nochmal für jedes Byte eingeln gedreht sein, aber das erkennt man ja in einem Vergleichswert.
Wobei du in deiner Beschreibung vergessen hast zu erwähnen was du bekommst und was du erwartest.

=> BinToHex oder ganz einfach Format mit
Delphi-Quellcode:
%.8x
[edit] OK, dann ht sich das mit der 255 geklärt und ist gut so ^^

DeddyH 3. Dez 2013 11:03

AW: VBA Script in Delphi umsetzen
 
Mal ein Versuch:
Delphi-Quellcode:
function Skr_CRC32(const Data: string): string;
var
  i, lCRC32, iBit: DWORD;
  Crc32Table: array[0..255] of DWORD;
begin
  for i := Low(Crc32Table) to High(Crc32Table) do
    begin
      lCRC32 := i;
      for iBit := 0 to 7 do
        begin
          if lCRC32 and $01 <> 0 then
            lCRC32 := ((lCRC32 and $FFFFFFFE div 2) and $7FFFFFFF) xor $EDB88320
          else
            lCRC32 := (lCRC32 and $FFFFFFFE div 2) and $7FFFFFFF;
        end;
      Crc32Table[i] := lCRC32;
    end;
  lCRC32 := $FFFFFFFF;
  for i := 1 to Length(Data) do
    lCRC32 := ((lCRC32 and $FFFFFF00 div $100) and $00FFFFFF) xor
      Crc32Table[(lCRC32 and $FF) xor Ord(Data[i])];
  Result := Format('%.8x', [lCRC32 xor $FFFFFFFF]);
end;
Ohne Vergleichswerte fällt das Testen allerdings schwer.

himitsu 3. Dez 2013 11:50

AW: VBA Script in Delphi umsetzen
 
Delphi-Quellcode:
lCRC32 xor $FFFFFFFF
=
Delphi-Quellcode:
not lCRC32


Bei
Delphi-Quellcode:
(lCRC32 and $FFFFFFFE div 2)
fehlt die Klammer um das AND, aber
Delphi-Quellcode:
$FFFFFFFE
scheint nur dazusein, damit das
Delphi-Quellcode:
/
einen ganzzahligen Wert liefert.
>
Delphi-Quellcode:
((lCRC32 and $FFFFFFFE) div 2)
oder einfach nur
Delphi-Quellcode:
lCRC32 div 2
, da DIV das ganzzahlige Abrunden schon erledigt.


Delphi-Quellcode:
lCRC32 and $01 <> 0
dürfte dem Delphi-Referenz durchsuchenOdd entsprechen
Und bei
Delphi-Quellcode:
(lCRC32 and $FFFFFF00 div $100)
bin ich mir nicht ganz sicher, ob Delphi das DIV nicht vor dem AND aufläst, aber auch hier dürfte
Delphi-Quellcode:
lCRC32 div $100
oder
Delphi-Quellcode:
lCRC32 shr 8
ausreichen.
In
Delphi-Quellcode:
((lCRC32 and $FFFFFF00 div $100) and $00FFFFFF)
kann das
Delphi-Quellcode:
and $00FFFFFF
weg, da das erste $FF000000 sowieso leer ist. (wegen dem div $100)


(mit bissl Syntax-Highlighting und als Pascal, sticht gleich so viel in Auge)


[add]
Mir fällt grade auf, daß die im originalen Code auch schon die Klammern unterschiedlich gesetzt haben.
z.B.
Delphi-Quellcode:
(lCRC32 And &HFFFFFFFE) \ &H2
und
Delphi-Quellcode:
lCRC32 And &HFFFFFF00 \ &H100

Hier müsste man aufpassen in welcher Reihenfolge Visual Basic und Delphi die AND|OR|*|/|DIV auflösen.

BUllweih 3. Dez 2013 12:04

AW: VBA Script in Delphi umsetzen
 
Zitat:

Zitat von DeddyH (Beitrag 1238335)
Mal ein Versuch:
Delphi-Quellcode:
function Skr_CRC32(const Data: string): string;
var
  i, lCRC32, iBit: DWORD;
  Crc32Table: array[0..255] of DWORD;
begin
  for i := Low(Crc32Table) to High(Crc32Table) do
    begin
      lCRC32 := i;
      for iBit := 0 to 7 do
        begin
          if lCRC32 and $01 <> 0 then
            lCRC32 := ((lCRC32 and $FFFFFFFE div 2) and $7FFFFFFF) xor $EDB88320
          else
            lCRC32 := (lCRC32 and $FFFFFFFE div 2) and $7FFFFFFF;
        end;
      Crc32Table[i] := lCRC32;
    end;
  lCRC32 := $FFFFFFFF;
  for i := 1 to Length(Data) do
    lCRC32 := ((lCRC32 and $FFFFFF00 div $100) and $00FFFFFF) xor
      Crc32Table[(lCRC32 and $FF) xor Ord(Data[i])];
  Result := Format('%.8x', [lCRC32 xor $FFFFFFFF]);
end;
Ohne Vergleichswerte fällt das Testen allerdings schwer.


Danke für die Mühe,
Ich habe es fast ähnlich gelöst.

Delphi-Quellcode:
Function Skr_CRC32(Data :String) : String;
function Hex(data: longint; width: word): string;
  (* pads with leading zeroes to reach specified width; use width=0 for tight fit *)
  const
    HexChars: array[0..$F] of char = '0123456789ABCDEF';
  var
    txt: string;
  begin
    txt := '';
    repeat
      insert(HexChars[data and $F],txt,1);
      data := data shr 4;
    until data=0;
    while length(txt) < width do
      insert('0',txt,1);
    Hex:= txt;
  end;

var
  i, lCRC32, iBit      : dword;
  Crc32Table           : array[0..255] of dword;
  txt                  : string;
begin
  For i := 0 To 255 do  //$B40BBE37
   begin
      lCRC32 := i;
      For iBit := 0 To 7 do
       begin
          If (lCRC32 And $1) <> 0 Then
              lCRC32 := (((lCRC32 And $FFFFFFFE) div $2) And $7FFFFFFF) Xor $EDB88320
          Else
              lCRC32 := ((lCRC32 And $FFFFFFFE) div $2) And $7FFFFFFF;
       end;
      Crc32Table[i] := lCRC32;
  end;

  lCRC32 := $FFFFFFFF;
  For i := 1 To length(Data) do
   begin

      lCRC32 := ((lCRC32 And $FFFFFF00 div $100) And $FFFFFF) Xor
       Crc32Table[(lCRC32 and $FF) xor Ord(Data[i])];

   end;
  result := Hex(lCRC32 Xor $FFFFFFFF,8);
end;
Ich habe nur ein Problem.
Das Script gibt in Excel(VBA) beim User(testuser) immer testuser->60DA836E aus und das Delphiprog testuser->B9851374


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:47 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz