CRC 16 CCIT/X25 hesaplama sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
seci20

CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

ustalarım merhaba bu hesaplama sisteminin kaynak kodunu bir turlu bulamadım...bulduklarımda doğru sonuca ulaştırmadı beni.Normalde söyle olmalı.

Bu hex Kodunun sonucu bu olmalı ama internette bulunan hesaplamaların sonucu bır turlu bu olmuyor.bulan yada hesaplıyabılen var ıse yardımcı olursa çok sevınırım
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

http://www.sunshine2k.de/coding/javascr ... rc_js.html

linteki sitede hesapladığınızda doğru sonuç çıkıyor ama kaynak kodunu göremediğim için delphiye eklıyemıyorum
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Aşağıdaki şekilde kullan. Afiyet olsun.

Kod: Tümünü seç

function CRC16_ozel( strDeger:String ):Cardinal;
  const
    bMask : array[0..31] of DWord =
      ($00000001, $00000002, $00000004, $00000008,
       $00000010, $00000020, $00000040, $00000080,
       $00000100, $00000200, $00000400, $00000800,
       $00001000, $00002000, $00004000, $00008000,
       $00010000, $00020000, $00040000, $00080000,
       $00100000, $00200000, $00400000, $00800000,
       $01000000, $02000000, $04000000, $08000000,
       $10000000, $20000000, $40000000, $80000000);
  function CrcReflect(dwDeger: DWord; BitSay:Word ): DWord;
  var
    i   : Integer;
  begin
    Result := dwDeger;
    for i := 0 to (BitSay-1) do
    begin
      if (dwDeger and 1) <> 0
      then Result := Result or      bMask[(BitSay-1) - i]
      else Result := Result and not bMask[(BitSay-1) - i];
      dwDeger := dwDeger shr 1;
    end;
  end;
var
  i,j: Integer;
  Data   : DWord;
begin
  Result := $FFFF;
  for i  := 1 to Length(strDeger) do
  begin
    Data   := CrcReflect( Ord(strDeger[i] ), 8 );
    Result := Result xor ( Data shl 8 );
    for j := 0 to 7 do
    begin
      if (Result and $8000 ) <> 0
        then Result:=(Result shl 1) xor $1021
        else Result:= Result shl 1;
      Result := Result and $FFFF;
    end;
  end;
  Result:= CrcReflect( Result, 16 ) xor $FFFF;
end;
Kullanımı :

Kod: Tümünü seç

Var
  strVeri  : String;
  Sonuc    : Cardinal;
begin
//Önceki sorundaki de doğru çıkıyor...
//strVeri  := Chr($1A)+Chr($11)+Chr($11)+Chr($11)+Chr($11)+Chr($11)+Chr($11)+Chr($11);

  strVeri  := Chr($1A);
  Sonuc    := CRC16_ozel( strVeri );
  ShowMessageFmt( '%x', [ Sonuc ] );
end;
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam ALLAH sizden binkez razı olsun sizin hakkınızı nasıl öüdem inanın bilmiyorum....çok çok teşekkür ederim...
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

mrmarman yazdı:Aşağıdaki şekilde kullan. Afiyet olsun.

Kod: Tümünü seç

function CRC16_ozel( strDeger:String ):Cardinal;
  const
    bMask : array[0..31] of DWord =
      ($00000001, $00000002, $00000004, $00000008,
       $00000010, $00000020, $00000040, $00000080,
       $00000100, $00000200, $00000400, $00000800,
       $00001000, $00002000, $00004000, $00008000,
       $00010000, $00020000, $00040000, $00080000,
       $00100000, $00200000, $00400000, $00800000,
       $01000000, $02000000, $04000000, $08000000,
       $10000000, $20000000, $40000000, $80000000);
  function CrcReflect(dwDeger: DWord; BitSay:Word ): DWord;
  var
    i   : Integer;
  begin
    Result := dwDeger;
    for i := 0 to (BitSay-1) do
    begin
      if (dwDeger and 1) <> 0
      then Result := Result or      bMask[(BitSay-1) - i]
      else Result := Result and not bMask[(BitSay-1) - i];
      dwDeger := dwDeger shr 1;
    end;
  end;
var
  i,j: Integer;
  Data   : DWord;
begin
  Result := $FFFF;
  for i  := 1 to Length(strDeger) do
  begin
    Data   := CrcReflect( Ord(strDeger[i] ), 8 );
    Result := Result xor ( Data shl 8 );
    for j := 0 to 7 do
    begin
      if (Result and $8000 ) <> 0
        then Result:=(Result shl 1) xor $1021
        else Result:= Result shl 1;
      Result := Result and $FFFF;
    end;
  end;
  Result:= CrcReflect( Result, 16 ) xor $FFFF;
end;
Kullanımı :

Kod: Tümünü seç

Var
  strVeri  : String;
  Sonuc    : Cardinal;
begin
//Önceki sorundaki de doğru çıkıyor...
//strVeri  := Chr($1A)+Chr($11)+Chr($11)+Chr($11)+Chr($11)+Chr($11)+Chr($11)+Chr($11);

  strVeri  := Chr($1A);
  Sonuc    := CRC16_ozel( strVeri );
  ShowMessageFmt( '%x', [ Sonuc ] );
end;
hocam sonuc cardinalını yani (Sonuc) strverinin sonuna koymak istersem 4 karakteri 2\2 ayırıp tersten yazıp nasıl koyabilirim.yani strveridenin hesaplamasını comporttan gonderırken sona koymam gerekli yani normalde söyle oluyor

Kod: Tümünü seç

ComPort1.Open;
ComPort1.ShowSetupDialog;
comport1.WriteStr(strVeri);
strverinin sonuna Sonuc cardinalını koymam lazım ama bir türlü başaramadım.bide sonucu tersten cevirip yazılması lazım yani Sonuc söyle diyelim comporttan veri gönderirken

Kod: Tümünü seç

$A1 $4F
diye göndermem gerekli.normalde stringde bunu başarabiliriyorum ama bunda çözemedim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Format fonksiyonunu bir çalış çözüm uzakta değil hocam.
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

mrmarman yazdı:Format fonksiyonunu bir çalış çözüm uzakta değil hocam.
mesajı aldım hocam araştırmıştım daha çok araştırıyorum :)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Soruyu yanlış anlamışım. Sen sadece sonucu terslemeyi soruyorsun. :roll:
Aşağıdaki fonksiyon iş görür. Basit bir string operasyonu. Baştaki 2'liyi al sona koy.
Ekstra olarak sadece hexa ikilisi olmayan değer varsa başına (0) ekleyen bir IF sorgusu var.

Kod: Tümünü seç

  Function Tersle( Deger: Cardinal ): string;
  Var
    strVeri, strTersVeri  : String;
  begin
    strVeri     := Format('%x', [ Deger ] );
    if Length( strVeri ) Mod 2 = 1
      then strVeri := '0' + strVeri; // çift haneye tamamlıyoruz.
    strTersVeri := '';
    while strVeri <> '' do
    begin
      strTersVeri := Copy(strVeri, 1, 2 ) + strTersVeri;
      system.Delete( strVeri, 1, 2 );
    end;
    Result := strTersVeri;
  end;
Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn6Click(Sender: TObject);
Var
  strVeri : String;
  Sonuc   : Cardinal;
begin
  strVeri  := Chr($1A);
  Sonuc    := CRC16_ozel( strVeri );
  ShowMessageFmt( '%x - %s', [sonuc, Tersle( Sonuc ) ] );
end;
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam yaziyi cevir kullanarak yapıyorum şu kod ile gönderiyorum.

Kod: Tümünü seç

strVeri  :=Chr($27)+Chr($26)+Chr($02)+Chr($08)+ Chr( StrToInt( '$' + sEdit45.Text[1]+'A'))+ Chr(StrToInt( '$' +yaziyicevir(k) ))+ Chr(StrToInt( '$' +yaziyicevir(a) ))+ Chr(StrToInt( '$' +yaziyicevir(b) ))+ Chr(StrToInt( '$' +yaziyicevir(c) ))+ Chr(StrToInt( '$' +yaziyicevir(d) ))+ Chr(StrToInt( '$' +yaziyicevir(g) ))+ Chr(StrToInt( '$' +yaziyicevir(h) ))+Tersle( Sonuc )+Chr($7E);
bana şu sonucu veriyor com portta yazdığı vakit.

Kod: Tümünü seç

#27#26#02#08#3A#65#64#89#47#65#89#45#33#39#36#33#7E  
sonucun showmessagedeki karşılığı showmessage doğru veriyor comport doğru gönderiyor ama arada iki tane 33 değeri giriyor yazmadığım halde.normalde bunlar 00 olsa gene kabul olur ama nereden araya giriyorlar bir türlü bulamadım.
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

bu arada hocam yazmayı unutmusum.bunlarda stringler.

Kod: Tümünü seç

k:=copy(sedit45.Text,2,2);
a:=copy(sedit45.Text,4,2);
b:=copy(sedit45.Text,6,2);
c:=copy(sedit45.Text,8,2);
d:=copy(sedit45.Text,10,2);
g:=copy(sedit45.Text,12,2);
h:=copy(sedit45.Text,14,2);
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Hocam sedit45'e ne yazdıyorsun söylememişsin.
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

kusura bakmayın unutmusum hocam şunu yazıyorum

Kod: Tümünü seç

356469874569854
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

(.) YazıyıCevir ne is görüyor ?
(.) k değişkeni için 2.nci karakterden başlayarak (3) olanı pass geçiyorsun bu doğru mu ?
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam yazıyı ters cevir söyle.

Kod: Tümünü seç

unction yaziyicevir(S : String): String;
Var
i,j:Integer;S1:string;
Begin
s1:='';
j:=Length(S);
For i := j DownTo 1 Do s1 := s1 + Copy(S,i,1) ;
For i := 1 To j Do
case ord(s1[i]) of
40 : s1[i]:=chr(41);
41 : s1[i]:=chr(40);
107 : s1[i]:=chr(107);
109 : s1[i]:=chr(109);
137 : s1[i]:=chr(137);
139 : s1[i]:=chr(139);
end;
yaziyicevir:=s1;
end;
ve gördüğü iş textin içindeki ayırdığım 2li basamakları ters ceviriyor.yani 45 ise comporttan gönderirken 54 olarak gönderiyor.
k değişkeni içinse 2. karakterden başlayıp 2 karakteri alıyorum.3 pas geçmiyorum yani.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

3 pass geçiliyor. Copy komutu ileri doğru çalışır geriye değil...
Resim
Resim ....Resim
Cevapla