Bir omuz kazanın sırt çantası
Bu ne kadar zor?
Bir şans ver!
_
Uzun basın tanıma
Baidu ile ilgili CRC hesaplama ilkelerini ve yöntemlerini tanıtan makale büyük bir itici güç.Belki saatlerce harcadıktan sonra onu anlayamayacak kadar aptaldım. Sonunda, sürekli deneme ve araştırmadan sonra, nihayet tüm hesaplama sürecini çözdüm. Özetlemek için bir kayıt yapın. . .
Hemen konuya gidelim: İnternette CRC'yi hesaplamak, aynı verileri girmek, aynı algoritmayı seçmek ve aynı sonucu almak için iki yazılım buldum.
İki yazılım arasındaki karşılık gelen ilişki aşağıdaki gibidir:
Bu parametreleri CRC Hesap Makinesi Bilgisinde anladıktan sonra, CRC sürecini anlayacaksınız.
İsim: Algoritmanın adıdır.Örneğin, 16-bit CRC için pek çok isim vardır, yani 16-bit CRC zahmetli olmasına rağmen birçok hesaplama yöntemi vardır.
Genişlik: CRC kontrol değerinin uzunluğunu ifade eder, genellikle 8 bit, 16 bit, 24 bit, 32 bit vb.
Poly: bir polinomun değeridir.Yukarıdaki şekildeki CRC-8: x8 + x2 + x + 1'i örnek olarak alın, bu ikili sistemin 1000000111 olduğu anlamına gelir,
En anlamlı 1'i kaldırın ve onaltılık gösterim 0x07'dir.
Init: Init'in basamak sayısı Poly ile aynıdır.Değeri tamamen 0 veya tümü F'dir.Tüm 0 olduğunda, algoritma başlamadan önce verilere CRC ekleyin (bu veriler RefIn değerine göre elde edilir) Hane sayısı 0 olduktan sonra, sonraki hesaplamalar yapılabilir. Hepsi 1 olduğunda, verilerin ilk CRC basamaklarının (yüksek bitlerin) algoritma başlamadan önce karşılık gelenlerle XOR'landığı (yani, ilk CRC basamaklarının değeri bit ile ters çevrilir) ve sonra eklendiği anlamına gelir. CRC rakamları sonraki hesaplamadan önce 0'dır.
RefIn ve Refout: Hepsi False veya Hepsi True,
RefIn False, yani giriş ham verisinin her bir baytının 7. bitinin en önemli bit olarak kabul edildiği ve 0. bitin en az anlamlı bit olarak kabul edildiği, yani normal hesaplamanın yeterli olduğu anlamına gelir.
RefIn True olduğunda, giriş orijinal verilerinin her bir baytının ters sırada işlenmesi gerekir Not: Tüm veriler için değil, her bayt için örnek olarak 4 baytlık bir orijinal veri alın:
Refout False olduğunda, çıktı işlenmez Refout True olduğunda, çıktı verisinin tüm verinin tersi sırasına göre işlenmesi gerekir Not: Buradaki ters sıra RefIn'den farklıdır. Bayt ters sırada değil ters sırada. Örnek olarak CRC-32'yi ele alalım, son veri 32 bittir, Refout True olduğunda kapak aşağıdaki gibidir:
XorOut: Yukarıdaki parametrelere göre hesaplama yaptıktan sonra bu numara ile özel bir VEYA gerçekleştirmek anlamına gelir.
Yukarıdaki 0x79 sonucunun kökenini inceleyelim:
1) 0x13, ikili olarak 00010011'e karşılık gelir
2) RefIn False olduğundan, 0x13 işlenmez veya 00010011
3) Init 0x00 olduğundan, 00010011'den sonra 80s ekleyin, giriş verisi 0001001100000000 olur
4) Polinom, ikili 100000111'e karşılık gelen x8 + x2 + x + 1'dir ve yukarıdaki 0001001100000000, polinoma karşılık gelen 100000111'e bölünür.
Tüm hesaplama süreci aşağıdaki gibidir:
10011 QUOTIENT
_________________
100000111) 0001001100000000 TEMETTÜ
BÖLÜM) 100000111
-------------
110111000
100000111
--------- XOR işlemi
101111110
100000111
---------
01111001 HATIRLATICI
Not: Yukarıdaki hesaplama, olağan bölme işleminde kullanılan çıkarma işlemini kullanmaz, burada çıkarma, özel VEYA ile değiştirilir.
Sonunda kalanı alın: 01111001
7) RefOuT False olduğundan, geri kalan değişmeden kalır ve hala 01111001'dir.
8) Xorout 0 olduğundan, tersine çevirmeye gerek olmadığı anlamına gelir, bu nedenle nihai sonuç, onaltılık 0x79 olan 01111001'dir.
Birini saymak yeterli değil, bir tane daha hesaplayalım
Bu sefer yukarıdakilerden tek fark, başlangıç değerinin orijinal 0x00'den 0xFF'ye değiştirilmesidir.Evet, bu örnek size başlangıç değerinin gerçekte ne anlama geldiğini gösterecektir.
3) Init 0xFF olduğundan, 00010011'in üstteki 8 biti önce 0xFF ile XORed edilmelidir, giriş verisi 11101100 olur ve sonra 80s eklenir ve 1110110000000000 olur
4) Polinom, ikili 100000111'e karşılık gelen x8 + x2 + x + 1'dir, yukarıdaki 1110110000000000'ü polinoma karşılık gelen 100000111'e bölün
Tüm hesaplama süreci aşağıdaki gibidir:
11101110 KONTEYNER
_________________
100000111) 1110110000000000 TEMETTÜ
110111110
101110010
111010100
110100110
101000010
10001010
00000000
---------
10001010 HATIRLATICI
Sonunda kalanı alın: 10001010
7) RefOuT False olduğundan, geri kalan değişmeden kalır ve halen 10001010
8) Xorout 0 olduğundan, tersine çevirmeye gerek olmadığı anlamına gelir, bu nedenle nihai sonuç, onaltılık 0x8A olan 10001010'dur.
Bu örnek, başlangıç değerinin anlamını gösterir, son örneğe bakalım, bu örnek RefIn ve RefOut'un özel anlamını True olarak göstermektedir.
1) 0x13, ikili olarak 00010011'e karşılık gelir
2) RefIn True olduğundan, 11001000 elde etmek için 0x13'ün ters çevrilmesi gerekir
3) Init 0x00 olduğundan, 2) 11001000'den sonra 40s ekleyin ve 110010000000 elde edin
4) Polinom, ikili 10011'e karşılık gelen x4 + x + 1'dir, yukarıdaki 110010000000'i 10011'e bölün
Tüm hesaplama süreci aşağıdaki gibidir:
11011110 KONTENJAN
______________
10011) 110010000000 TEMETTÜ
DİVİZÖR) 10011
-------------
10100
10011
---------
11100
11110
11010
10010
00010
00000
---------
0010 HATIRLATICI
Sonunda kalanı alın: 0010
7) RefOuT True olduğundan, kalanın 0100'e çevrilmesi gerekir
8) Xorout 0 olduğundan, tersine çevirmeye gerek olmadığı anlamına gelir, bu nedenle nihai sonuç 0100 olur
Yukarıda bahsedilen hesaplama sürecini anlarsanız, CRC'nin hesaplama ilkesinin netleşeceğine inanıyorum. Yazılım kodunun nasıl uygulanacağına gelince, bunu daha sonra tartışacağım. Kinetis MCU'lar için, birçok MCU'nun entegre donanım CRC modülleri vardır.CRC sonuçlarını hesaplamak için sadece konfigürasyon kayıtlarını yapılandırmanız gerekir. Ancak ister yazılım ister donanım uygulaması olsun, teorik temel her zaman ilktir.