module Crc32
Constants
- VERSION
Public Class Methods
calculate(p1, p2, p3)
click to toggle source
VALUE method_crc32_calculate(VALUE self, VALUE data, VALUE length, VALUE previousCrc32) { uint32_t datalen; uint32_t crc; uint32_t one, two; char *bindata; uint32_t* current; unsigned char* currentChar; VALUE crc32; datalen = NUM2UINT(length); bindata = StringValuePtr(data); crc = NUM2UINT(previousCrc32) ^ ~ 0U; current = (uint32_t*) bindata; // process eight bytes at once while (datalen >= 8) { one = *current++ ^ crc; two = *current++; crc = Crc32Lookup[7][ one & 0xFF] ^ Crc32Lookup[6][(one>> 8) & 0xFF] ^ Crc32Lookup[5][(one>>16) & 0xFF] ^ Crc32Lookup[4][ one>>24 ] ^ Crc32Lookup[3][ two & 0xFF] ^ Crc32Lookup[2][(two>> 8) & 0xFF] ^ Crc32Lookup[1][(two>>16) & 0xFF] ^ Crc32Lookup[0][ two>>24 ]; datalen -= 8; } currentChar = (unsigned char*) current; // remaining 1 to 7 bytes while (datalen--) crc = (crc >> 8) ^ Crc32Lookup[0][(crc & 0xFF) ^ *currentChar++]; crc = crc ^ ~0U; crc32=UINT2NUM(crc); return crc32; }