5 Eylül 2018 Çarşamba

Checksum

Checksum Nedir
Checksum verinin değişip değişmediğini anlamak için paketin başına veya sonuna eklenen fazladan bit veya byte'lardır. Açıklaması şöyle
The simplest checksum algorithm simply sums the bytes of the file, hence the name.
Checksum, CRC'ye göre daha basittir. Bir çok checksum, verinin byte'ları kendi içinde yer değiştirse bile tespit edemez. CRC bu tür şeyleri tespit eder. Checksum toplama ve bölme işlemlerinden ibarettir. Parity ise bitleri sayma işleminden ibarettir. En ünlü checksum algoritması "Internet Checksum" algoritması

Sum Of All Bytes Checksum
Bunun çeşitli türevleri bar. 255 - (sum of all bytes) şeklinde olan bir tanesi burada
To calculate the check sum you add all bytes of the packet, excluding the frame delimiter 7E and the length (the second and third bytes):

7E 00 08 08 01 4E 49 58 42 45 45 3B

Add these hex bytes:

0x08 + 0x01 + 0x4E + 0x49 + 0x58 + 0x42 + 0x45 + 0x45 = 0x01C4

Now take the result of 0x01C4 and keep only the lowest 8 bits which in this example is 0xC4 (the two far right digits). Subtract 0xC4 from 0xFF and you get 0x3B (0xFF - 0xC4 = 0x3B). 0x3B is the checksum for this data packet.
Örnek
Tüm byte'ların toplamını bulmak için şöyle yaparız
int checkSum = 0;
byte [] bytes = ...

for(byte b : bytes){
  checkSum += (0xff & b);
}

String checkSumHex = Integer.toHexString(checkSum & 0xFF);
Kredi Kartı Numarası Checksum
Kredi kartlarındaki son hane checksum için kullanılır.

1 Bit Parity
Eşlik biti seri iletişimde kullanılır. Even veya odd parity olarak kullanılır. Genelde 7 bit veri için kullanılır. 1'lerin toplamının tek veya çift olmasını sayar.

* Even parity eğer 1'lerin sayısı çift ise verinin sonuna 0 ekler. Tek ise 1 ekler- Amacı sayıyı çift yapmaktır.
* Odd parity eğer 1'lerin sayısı çift ise verinin sonuna 1 ekler. Tek ise 0 ekler - Amacı sayıyı tek yapmaktır.

Kodu şöyledir.
char checksum = 0;
for each (char c in buffer)
{
    checksum ^= c;
    SendToPC(c);
}
SendToPc(checksum);
Adler Checksum
ZLib tarafından kullanılır.

CRC Fonksiyonları
CRC fonksiyonları hash'in yanında daha basit kalıyor. CRC fonksiyonları 8,16,32,64 bit olabilir. 8 ve 64 bitlik CRC'ler pek kullanılmaz. Genellikle 16 veya 32 bit bir değer dönerler. CRC algoritması bit-by-bit, bit-by-bit-fast veya table-driven çalışma şeklinden birisini kullanır.

Bazı CRC isimler şöyle
CRC-16  
CRC-16 (Modbus) 
CRC-16 (Sick)   
CRC-CCITT (XModem)  
CRC-CCITT (0xFFFF)  
CRC-CCITT (0x1D0F)  
CRC-CCITT (Kermit)  
CRC-DNP 
CRC-32  
16 bit için kullanılan CRC polinomu 0XA001, 32 bit içinse 0x04C11DB7 olabilir. Little Endian çalışan platformlarda değerler ters çevrilir.

32 Bit
Basit bir algoritma şöyle
uint32_t update(uint32_t state, unsigned bit)
{
    if (((state >> 31) ^ bit) & 1) state = (state << 1) ^ 0x04C11DB7;
    else                           state = (state << 1);
    return state;
}

Boost

CRC yazısına taşdım.

Java
CRC32 Sınıfı yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder