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
Sum Of All Bytes Checksum
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 3BAdd these hex bytes:0x08 + 0x01 + 0x4E + 0x49 + 0x58 + 0x42 + 0x45 + 0x45 = 0x01C4Now 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 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 ChecksumZLib 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.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