AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

VBA Script in Delphi umsetzen

Ein Thema von BUllweih · begonnen am 3. Dez 2013 · letzter Beitrag vom 4. Dez 2013
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
BUllweih

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

VBA Script in Delphi umsetzen

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.399 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 10:57
Du könntest ja gern auch mal schreiben, was du schon übersetzt hast.

Was macht 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.



./ 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. 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 3. Dez 2013 um 11:04 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, 11:03
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
Michael
  Mit Zitat antworten Zitat
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
238 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 11:04
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?
~ In der Welt der Bits und Bytes ~
Delphi programming is awesome.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.399 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 11:06
Ich hab oben noch bissl was dazu-editiert.

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.261 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 11:08
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.
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.399 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 11:11
Bei 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 %.8x [edit] OK, dann ht sich das mit der 255 geklärt und ist gut so ^^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.261 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:03
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.
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.399 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 12:50
lCRC32 xor $FFFFFFFF = not lCRC32

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


lCRC32 and $01 <> 0 dürfte dem Delphi-Referenz durchsuchenOdd entsprechen
Und bei (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 lCRC32 div $100 oder lCRC32 shr 8 ausreichen.
In ((lCRC32 and $FFFFFF00 div $100) and $00FFFFFF) kann das 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. (lCRC32 And &HFFFFFFFE) \ &H2 und lCRC32 And &HFFFFFF00 \ &H100
Hier müsste man aufpassen in welcher Reihenfolge Visual Basic und Delphi die AND|OR|*|/|DIV auflösen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

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

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

AW: VBA Script in Delphi umsetzen

  Alt 3. Dez 2013, 13: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 19:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf