![]() |
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 |
AW: VBA Script in Delphi umsetzen
Du könntest ja gern auch mal schreiben, was du schon übersetzt hast.
Was macht
Delphi-Quellcode:
eigentlich?
ReDim Crc32Table(255)
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: |
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:
Das ist laut Beschreibung die Speicherreservierung.
ReDim Crc32Table(255)
MfG |
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? |
AW: VBA Script in Delphi umsetzen
Ich hab oben noch bissl was dazu-editiert.
Zitat:
0..255 sind allerdings 256. (nja, das kannst du aber auch gleich als statisches Array deklarieren und brauchts kein SetLength) |
AW: VBA Script in Delphi umsetzen
Nachschauen hat noch nie geschadet. Aus
![]() Zitat:
|
AW: VBA Script in Delphi umsetzen
Bei
Delphi-Quellcode:
mußt du aufpassen, in welcher reihenfolge das Hex die Werte schreibt.
Hex
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:
[edit] OK, dann ht sich das mit der 255 geklärt und ist gut so ^^
%.8x
|
AW: VBA Script in Delphi umsetzen
Mal ein Versuch:
Delphi-Quellcode:
Ohne Vergleichswerte fällt das Testen allerdings schwer.
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; |
AW: VBA Script in Delphi umsetzen
Delphi-Quellcode:
=
lCRC32 xor $FFFFFFFF
Delphi-Quellcode:
not lCRC32
Bei
Delphi-Quellcode:
fehlt die Klammer um das AND, aber
(lCRC32 and $FFFFFFFE div 2)
Delphi-Quellcode:
scheint nur dazusein, damit das
$FFFFFFFE
Delphi-Quellcode:
einen ganzzahligen Wert liefert.
/
>
Delphi-Quellcode:
oder einfach nur
((lCRC32 and $FFFFFFFE) div 2)
Delphi-Quellcode:
, da DIV das ganzzahlige Abrunden schon erledigt.
lCRC32 div 2
Delphi-Quellcode:
dürfte dem
lCRC32 and $01 <> 0
![]() Und bei
Delphi-Quellcode:
bin ich mir nicht ganz sicher, ob Delphi das DIV nicht vor dem AND aufläst, aber auch hier dürfte
(lCRC32 and $FFFFFF00 div $100)
Delphi-Quellcode:
oder
lCRC32 div $100
Delphi-Quellcode:
ausreichen.
lCRC32 shr 8
In
Delphi-Quellcode:
kann das
((lCRC32 and $FFFFFF00 div $100) and $00FFFFFF)
Delphi-Quellcode:
weg, da das erste $FF000000 sowieso leer ist. (wegen dem div $100)
and $00FFFFFF
(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:
und
(lCRC32 And &HFFFFFFFE) \ &H2
Delphi-Quellcode:
lCRC32 And &HFFFFFF00 \ &H100
Hier müsste man aufpassen in welcher Reihenfolge Visual Basic und Delphi die AND|OR|*|/|DIV auflösen. |
AW: VBA Script in Delphi umsetzen
Zitat:
Danke für die Mühe, Ich habe es fast ähnlich gelöst.
Delphi-Quellcode:
Ich habe nur ein Problem.
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; 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 04:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz