Checksum algoritması hakkında

Başlatan armas, 27 Temmuz 2015, 00:52:00

armas

Merhabalar,

Öncelikle haberleşmede kullanılan checksum hesaplamanın tek bir algoritması veya daha fazla algoritmanın olup olmadığı konusunda kafam karıştı. Çünkü checksum hakkında okuduğum yazılarda herkes farklı şeyler anlatmış. Elimde checksumı hesaplayan bir algoritma var fakat bunu da tam anlamıyla anlayamadım. Bu konuda yardımcı olursanız sevinirim. Kod şu şekilde ;

uint8_t CalculatePEC(uint8_t *array, uint8_t len){

uint8_t rem= 0x41;

uint8_t i=0, j=0;

for(i=0; i<len; i++) {

rem= rem^ array[i];

for(j=0; j<8; j++) {

if(rem & 0x80) { // if leftmost (most significant) bit is set

rem= (rem<< 1) ^ 0x07;

}

else {

rem= rem<< 1;

}

}

}

return rem;

}


Kod aşağıda verilen string örneğinde cheksumı hesaplıyor.

[0000070,043,019,000,1307,+0028,+0000,-00000,-00001,0001]245*


245 cheksum değeri. Cevaplarınız için şimdiden teşekkürler.

Gökhan BEKEN

#1
Birsürü CRC yöntemi var.
Hex Workshop Hex Editor adlı program ile seçtiğiniz veriler için checksum hesaplayabiliyorsunuz.


Veri sayısı kadar dönen bir döngü kurup, verinin her byte'ını bu fonksiyona göndereceksiniz, checksum değeri sürekli güncellenmiş olacak.
Döngüden çıktıktan sonra, verinin sonunda ekli bulunan checksum ile sizin bulduğunuz checksum değeri aynı mı diye kontrol edeceksiniz.
Aynı ise iyi de, farklı ise sıkıntı büyük :)

Kullandığınız mcu'nun donanımsal CRC özelliğini kullanmanız daha verimli olur bence.
Özel mesaj okumuyorum, lütfen göndermeyin.

Tagli

Sanırım checksum türüne göre işlemde kullanılan polinom değişiyor. Bazı işlemcilerin donanımsal CRC modüllerinde bu polinom sabit, o yüzden tek türde CRC işlemi yapabiliyorlar.
Gökçe Tağlıoğlu

vsalma

#3
Cok sayida checksum algoritmasi var. Hesaplamak icin bir polinom kullaniliyor. Secilen polinomun hesaplanmasi bazen kodddaki gibi bitwise islemlerle yapilabilir. Bu performans avantaji sagliyor ama bildigim kadariyla her polinom bu sekilde uygulanamaz. Hangi polinomu sececeginiz data uzunluguna, data icerigine gore degisir. Degisik polinomlar degisik veriler icin daha iyi sonuc verebilirler. Internette ne zaman hangi polinomu secmeniz gerektigine dair yazilar bulabilirisiniz.

Kodunuzda hangi polinomun uygulandigini bilmiyorsaniz anlamaya ugrasmayin. Cunku o, polinoma gore optimize edilmis bir kod. 

Bazen polinomu gelen dataya gore hesaplamak yerine hazir hesaplanmis katsayilar tablo olarak koda eklenir ve bu sekilde kullanilir.

Bu slayt da guzel duruyor.
http://users.ece.cmu.edu/~koopman/pubs/KoopmanCRCWebinar9May2012.pdf

engerex

Checksum (8,16,32 bit) verileri sadece topladığı için çok güvenilir değil. Yani 12345 ile 52341 farklı olsa da değerler toplandığı için aynı sonuç dönecek. Bu yüzden CRC32, MD5 gibi algoritmalar çok çok daha güvenilir.

Tagli

Evet, pardon, CRC ile checksum aynı şey değil. Kavramları karıştırmışım.
Gökçe Tağlıoğlu