Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi VB Code zu Delphi - Probleme mit Bytearray (https://www.delphipraxis.net/107763-vbulletin-code-zu-delphi-probleme-mit-bytearray.html)

mrhyde 1. Feb 2008 19:29


VB Code zu Delphi - Probleme mit Bytearray
 
Hi Zusammen,

kann mir jemand folgendes in Delphi umcoden?
Unter VB läuft das Problemlos.
Hab schon alles mögliche unter Delphi probiert komm aber nicht richtig klar mit dem Bytearray in Delphi. :wall:


Delphi-Quellcode:
Public Sub crc()
    Dim mask, j, n, crc As Integer
    Dim bt(24) As Byte
    Dim crct As String
   
    z = 0
    crc = -1 ' crc mit $ffff initalisieren
    For n = 1 To Len(TextBox1.Text) Step 2
        j = Mid(TextBox1.Text, n, 2) 'je 2 Zeichen filtern
        z = z + 1 'Zaehler für Bytearray
        bt(z) = CByte("&H" & j)
       
        crc = crc Xor bt(z)
        For j = 1 To 8
            mask = 0
            If crc / 2 <> Int(crc / 2) Then mask = &HA001
            crc = Int(crc / 2) And &H7FFF: crc = crc Xor mask
        Next j
    Next n
   
    TextBox2.Text = crc ' crc anzeigen
End Sub
Wär echt cool wenn das jemand übernehmen könnte - damit ich mal ein Beispiel habe.

DeddyH 1. Feb 2008 19:36

Re: VB Code zu Delphi - Probleme mit Bytearray
 
Ganz blöd würde ich sagen, das ist ein Array[1..24] of byte. Ohne Gewähr!

mrhyde 2. Feb 2008 14:34

Re: VB Code zu Delphi - Probleme mit Bytearray
 
Erstmal danke DeddyH für deine Antwort.

Ja, das mit dem Array hab ich auch schon probiert, nur das Problem ist, dass ich wie im VB Besipiel 2 Zeichen in 1 Byte quetschen muss.
Ich weiss nicht wie es VB intern funktioniert, weil ja die Typkonvertierung der Variablen dort autom. geschieht - auf jedenfalls geht es dort. Nur wenn ich das Ganze in Delphi umschreiben möchte, dann bringt er mir einen Fehler.

Anbei mal mein Delphi Code:

Delphi-Quellcode:
procedure ByteCrc(data:byte;var crc:word);
var i:BYTE;
Begin
    for i:=0 to 7 do
    begin
    if (( data and $01) xor ( crc and $0001) <> 0 ) then
        begin
        crc:=crc shr 1; //1 Pos nach rechts schieben
        crc:=crc xor $A001;
        end
    else crc:=crc shr 1;
    data:=data shr 1;
    end;
end;

function StringCrc(s:shortstring):word;
var len,i:integer;
begin
    result:=0;
    len:=length(s);
    for i:=1 to len do
      if i mod 2 = 0 then //alle 2 Zeichen
        ByteCrc(ord(s[i]),result); // CRC Byteweise bilden << Hier sollten 2 Zeichen als Byte der Prozedur ByteCRC übergeben werden.
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var s:shortstring;
    h:word;
begin
    s:=edit1.Text;

    h:=StringCrc(s);
    Edit2.Text:=IntToHex(h,4);

end;
Ich weiss es hört sich komisch an mit 2 Zeichen in einem Byte, aber in VB funktionierts.
Vielleicht weisst jemand weiter.

marabu 2. Feb 2008 15:26

Re: VB Code zu Delphi - Probleme mit Bytearray
 
Herzlich willkommen in der Delphi-PRAXiS, mrhyde.

Ich würde den VB-Code nicht direkt übersetzen. Was du benötigst ist eine Funktion zur Polynomdivision und eine Funktion zur Wandlung von Hex-Code in Bytes.

Vielleicht interessiert dich dieser Thread: klick

Freundliche Grüße auch an drjekyll

mrhyde 2. Feb 2008 16:05

Re: VB Code zu Delphi - Probleme mit Bytearray
 
Irgendwie komm ich da nicht recht klar damit,
habe etwas mit den Besipielen herumgespielt und es jedoch nicht geschafft aus

00057E0440404040

den CRC: F1CA zu erlangen.

marabu 2. Feb 2008 18:13

Re: VB Code zu Delphi - Probleme mit Bytearray
 
Hallo,

mit den CRC-Werten ist das so eine Sache - es gibt ein paar Freiheitsgrade, wie z.B. die Initialisierung des Schieberegisters und die Invertierung des Ergebnisses. Die Kenntnis des Polynoms reicht einfach nicht aus. Du hast wahrscheinlich den negierten Wert 0E35 erhalten.

So wirst du dann glücklich:

Delphi-Quellcode:
ShowMessage(IntToHex(ModbusCRC16(s, $FFFF), 4));
Freundliche Grüße

mrhyde 3. Feb 2008 11:40

Re: VB Code zu Delphi - Probleme mit Bytearray
 
Hey marabu du bist der Beste ;-)

Hab das 'not' übersehen - thx hast mir sehr geholfen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.

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