2016年8月18日 星期四

swift + crc32

 class CRC32 {
    var data = NSData()
    
    private static let crcTableLength = Int(UInt8.max) + 1
    private static var _crcTable = [UInt32](count: crcTableLength, repeatedValue: 0)
    private static var crcTable: [UInt32] {
        get {
            if _crcTable[1] != 0 {
                return _crcTable
            }
            for n in 0..
                var c = UInt32(n)
                for _ in 0..<8 {
                    if ((c & 1) != 0) {
                        c = 0xedb88320 ^ (c >> 1)
                    } else {
                        c = c >> 1
                    }
                }
                _crcTable[n] = c
            }
            
            return _crcTable
        }
    }
    
    func getCRC() -> Byte4 {
        var crc: Byte4 = 0
        crc = ~crc
        
        var buf = UnsafePointer<UInt8>(data.bytes)
        let len = data.length
        
        for _ in 0..
            let toBuf = buf.memory
            buf += 1
            let i = Int((crc ^ UInt32(toBuf)) & 0xFF)
            crc = self.dynamicType.crcTable[i] ^ crc >> 8
        }
        
        return ~crc
    }
}

沒有留言: