Kontrolní součet BSD - BSD checksum
The Algoritmus kontrolního součtu BSD je běžně používané dědictví kontrolní součet algoritmus. Bylo implementováno v BSD a je také k dispozici prostřednictvím internetu Součet GNU obslužný program příkazového řádku.
Výpočet kontrolního součtu BSD
Níže je uvedena příslušná část souboru GNU součet zdrojový kód (GPL s licencí). Vypočítává 16bitový kontrolní součet sečtením všech bajtů (8bitových slov) vstupního datového proudu. Aby se předešlo mnoha slabostem jednoduchého přidání dat, je akumulátor kontrolního součtu v každém kroku před přidáním nového znaku kruhový otočený o jeden bit doprava.
int bsdChecksumFromFile(SOUBOR *fp) / * Popisovač souboru pro vstupní data * /{ int kontrolní součet = 0; / * Modul kontrolního součtu 2 ^ 16. * / pro (int ch = getc(fp); ch != EOF; ch = getc(fp)) { kontrolní součet = (kontrolní součet >> 1) + ((kontrolní součet & 1) << 15); kontrolní součet += ch; kontrolní součet &= 0xffff; / * Udržujte to v mezích. * / } vrátit se kontrolní součet;}
Níže je ukázkový kód Java, který vypočítává 8bitový kontrolní součet. Přidá každý bajt ze vstupního bajtového pole po kruhové rotaci kontrolního součtu.
byte kontrolní součet(byte[] vstup) { byte kontrolní součet = 0; pro (byte cur_byte: vstup) { kontrolní součet = (byte) (((kontrolní součet & 0xFF) >>> 1) + ((kontrolní součet & 0x1) << 7)); // Otočení akumulátoru kontrolní součet = (byte) ((kontrolní součet + cur_byte) & 0xFF); // Přidejte další blok } vrátit se kontrolní součet;}
Popis algoritmu
Jak již bylo zmíněno výše, tento algoritmus vypočítá kontrolní součet segmentací dat a jejich přidáním do akumulátoru, který je mezi každou sumací posunut doprava. Aby se akumulátor udržel v mezích návratové hodnoty, provádí se maskování bitů s 1.
Příklad: Výpočet 4bitového kontrolního součtu pomocí segmentů velikosti 4bitů (big-endian )
Vstup: 101110001110 -> tři segmenty: 1011, 1000, 1110.
Iterace 1:
segment: 1011 kontrolní součet: 0000 bitová maska: 1111
a) Použijte kruhový posun na kontrolní součet:
0000 -> 0000
b) Přidejte kontrolní součet a segment dohromady, naneste bitovou masku na získaný výsledek:
0000 + 1011 = 1011 -> 1011 & 1111 = 1011
Iterace 2:
segment: 1000 kontrolní součet: 1011 bitová maska: 1111
a) Použijte kruhový posun na kontrolní součet:
1011 -> 1101
b) Přidejte kontrolní součet a segment dohromady, naneste bitovou masku na získaný výsledek:
1101 + 1000 = 10101 -> 10101 & 1111 = 0101
Iterace 3:
segment: 1110 kontrolní součet: 0101 bitová maska: 1111
a) Použijte kruhový posun na kontrolní součet:
0101 -> 1010
b) Přidejte kontrolní součet a segment dohromady, naneste bitovou masku na získaný výsledek:
1010 + 1110 = 11000 -> 11000 & 1111 = 1000
Konečný kontrolní součet: 1000
Zdroje
- oficiální zdrojový kód součtu FreeBSD
- oficiální ruční stránka GNU součtu
- stránka ke stažení coreutils --- najděte a rozbalte nejnovější verzi balíčku coreutils, přečtěte si src / sum.c