AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VBA Script in Delphi umsetzen

Ein Thema von BUllweih · begonnen am 3. Dez 2013 · letzter Beitrag vom 4. Dez 2013
Antwort Antwort
BUllweih

Registriert seit: 17. Jul 2007
Ort: Medard
17 Beiträge
 
Delphi XE7 Enterprise
 
#1

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:04
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
Michael
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.751 Beiträge
 
Delphi 12 Athens
 
#2

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:19
Zitat:
Ich habe nur ein Problem.
- Die erwähnten Punkte, bezüglich der Klammerungen, hast du mal durchprobiert?

Und bei dem DWORD bin ich mir auch nicht sicher.
Was nimmt den VB als Typ, wenn man das so als DIM deklariert?

DWORD/Cardinal oder Integer ... je nach dem, kommt bei $8******* bzw. $F******* (usw.) etwas Anderes raus, wenn man DIV verwendet > mit oder ohne Vorzeichen.


Zitat:
Delphi-Quellcode:
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;
Ich würde dir empfehlen nicht den Funktionsnamen als Zuweisung zu nutzen.
Es geht zwar, aber Result ist da besser.
- man sieht, daß es der Rückgabewert ist (und nicht irgendeine Variable von sonstwo)
- und wenn man die Funktion umbenennt, dann muß man nicht aufpassen wo der Name in der Funktion noch verwendet wird

Und du kannst dann auch die Variable txt weglassen und stattdessen direkt Result verwenden, denn das kann man auch auslesen, im Gegensatz zu dem Funktionsnamen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Dez 2013 um 12:23 Uhr)
  Mit Zitat antworten Zitat
BUllweih

Registriert seit: 17. Jul 2007
Ort: Medard
17 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:36
Ja ich habe die Klammerungen getestet, es hat sich aber nichts geändert.

Delphi-Quellcode:
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 div $2) And $7FFFFFFF) Xor $EDB88320
          Else
              lCRC32 := (lCRC32 div $2) And $7FFFFFFF;
       end;
      Crc32Table[i] := lCRC32;
  end;

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

      lCRC32 := ((lCRC32 shr 8) And $FFFFFF) Xor
       Crc32Table[(lCRC32 and $FF) xor Ord(Data[i])];

   end;
  result := Hex(lCRC32 Xor $FFFFFFFF,8);
end;
Wenn ich allerdings diese Deklaration ändere i, lCRC32, iBit : dword ; von dword in integer kommt was anderes raus. Aber auch nicht das was VBA macht.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#4

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:42
Gib uns doch mal ein paar Beispiele mit Eingangsstring und Ergebnis des Makros.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BUllweih

Registriert seit: 17. Jul 2007
Ort: Medard
17 Beiträge
 
Delphi XE7 Enterprise
 
#5

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:46
test -> 7A635C01
hugo ->6A0D2BDA
karlos -> F1BFB3B6
inge -> FEB506DD
Michael
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#6

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 13:09
Ich komme auch nicht auf die Werte. Wenn ich das richtig gelesen habe, sind Variablen ohne Typangabe automatisch Varianten, evtl. müsste man damit noch soweit es geht herumdoktern. Aber auch da bleibt die Frage nach Unterschieden zwischen VBA und Delphi.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BUllweih

Registriert seit: 17. Jul 2007
Ort: Medard
17 Beiträge
 
Delphi XE7 Enterprise
 
#7

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 13:25
ich habe jetzt in dem VBA-Script die DIM Variablen als Integer gesetzt.

Code:
Function Skr_CRC32(Data As String) As String
Dim i, lCRC32, iBit As Integer
Es kommt dann immer noch das selbe Ergebnis raus. Nur nicht das vom Delphicode
Michael
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.751 Beiträge
 
Delphi 12 Athens
 
#8

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 13:26
sind Variablen ohne Typangabe automatisch Varianten
Dann würde ich vorschlangen es mal mit Integer statt DWord zu probieren. (wobei ich dann eher denken würde, daß VB da falsch rechnet)

Folgendes ans Ende der Funktion hängen. Auch beim VBS. (wobei man es in delphi natürlich auch via Debugger auslesen könnte )
Delphi-Quellcode:
For i := 0 To 255 do
  Result := Result + ' ' + Hex(Crc32Table[i], 8);
Mal sehen ob schon die Tabelle falsch ist und die eigentlich CRC-Berechnung dann eh nicht funktionieren kann.

Zitat:
Dim i, lCRC32, iBit As Integer
Ja, denn was hab ich bezüglich dem * und DIV gesagt?
Das höchste Bit (das Vorzeichen) wird bei Integer und Cardinal/DWORD anders behandelt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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