mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 17:55:41 +08:00
53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
![]() |
package ssr
|
||
|
|
||
|
import "encoding/binary"
|
||
|
|
||
|
var (
|
||
|
crc32Table = make([]uint32, 256)
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
createCRC32Table()
|
||
|
}
|
||
|
|
||
|
func createCRC32Table() {
|
||
|
for i := 0; i < 256; i++ {
|
||
|
crc := uint32(i)
|
||
|
for j := 8; j > 0; j-- {
|
||
|
if crc&1 == 1 {
|
||
|
crc = (crc >> 1) ^ 0xEDB88320
|
||
|
} else {
|
||
|
crc >>= 1
|
||
|
}
|
||
|
}
|
||
|
crc32Table[i] = crc
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func CalcCRC32(input []byte, length int, value uint32) uint32 {
|
||
|
value = 0xFFFFFFFF
|
||
|
return DoCalcCRC32(input, 0, length, value)
|
||
|
}
|
||
|
|
||
|
func DoCalcCRC32(input []byte, index int, length int, value uint32) uint32 {
|
||
|
buffer := input
|
||
|
for i := index; i < length; i++ {
|
||
|
value = (value >> 8) ^ crc32Table[byte(value&0xFF)^buffer[i]]
|
||
|
}
|
||
|
return value ^ 0xFFFFFFFF
|
||
|
}
|
||
|
|
||
|
func DoSetCRC32(buffer []byte, index int, length int) {
|
||
|
crc := CalcCRC32(buffer[:length-4], length-4, 0xFFFFFFFF)
|
||
|
binary.LittleEndian.PutUint32(buffer[length-4:], crc^0xFFFFFFFF)
|
||
|
}
|
||
|
|
||
|
func SetCRC32(buffer []byte, length int) {
|
||
|
DoSetCRC32(buffer, 0, length)
|
||
|
}
|
||
|
|
||
|
func CheckCRC32(buffer []byte, length int) bool {
|
||
|
crc := CalcCRC32(buffer, length, 0xFFFFFFFF)
|
||
|
return crc == 0xFFFFFFFF
|
||
|
}
|