-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCrc32.kt
More file actions
29 lines (27 loc) · 1.57 KB
/
Crc32.kt
File metadata and controls
29 lines (27 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package ru.romanow.algorithms
class Crc32 {
fun compute(data: ByteArray): Int {
// Стандартный полином CRC-32 IEEE 802.3: 0x04C11DB7
val poly = 0x04C11DB7
// Начальное значение CRC (все биты = 1)
var crc = 0xFFFFFFFF.toInt()
// Обработка каждого байта входных данных
for (byte in data) {
// Преобразуем байт к Int и сдвигаем влево на 24 бита. Это нужно,
// чтобы выставить обрабатываемый байт в старшие биты регистра CRC.
var b = byte.toInt() shl 24
// Обработка каждого бита текущего байта
repeat(8) {
// XOR старшего бита CRC и текущего бита байта. Если результат
// имеет установленный старший бит, применяем полином.
val bit = ((crc xor b) and 0x80000000.toInt()) != 0
// Сдвигаем CRC влево на 1 бит
crc = (crc shl 1) xor if (bit) poly else 0
// Сдвигаем байт влево на 1 бит, чтобы перейти к следующему биту
b = b shl 1
}
}
// Инвертируем все биты в конце (финальный XOR), как требует стандарт CRC-32
return crc.inv()
}
}