crc32.c revision f877ee033a0737100c2f661a7ca4c559ea2ddb8a
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2006 Timo Sirainen */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#include "lib.h"
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#include "crc32.h"
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainenstatic uint32_t crc32tab[256] = {
65988f5a8abed57e9894fec77105941e046d3490Timo Sirainen 0x00000000,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E,
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
dabb4cec4cf9bdb34013de682b08f1284cfb670fTimo Sirainen 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
64510d2cc23a79d2142030bf5bade44baa490db3Timo Sirainen 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4,
64510d2cc23a79d2142030bf5bade44baa490db3Timo Sirainen 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
5cbefc6537aefbf1491416c433de00fc3e649a13Timo Sirainen 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E,
f335accff54f408a8bbb328f8098ad458f2ff58eTimo Sirainen 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
f335accff54f408a8bbb328f8098ad458f2ff58eTimo Sirainen 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2,
2e03303e721a293d796c0287829396f5caea76eaTimo Sirainen 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6,
db24d60c306c9d477392ff5b61cb3fc95fef3bb7Timo Sirainen 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82,
5cbefc6537aefbf1491416c433de00fc3e649a13Timo Sirainen 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
5cbefc6537aefbf1491416c433de00fc3e649a13Timo Sirainen 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF,
5cbefc6537aefbf1491416c433de00fc3e649a13Timo Sirainen 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
5cbefc6537aefbf1491416c433de00fc3e649a13Timo Sirainen 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen};
db24d60c306c9d477392ff5b61cb3fc95fef3bb7Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenuint32_t crc32(const void *data, size_t size)
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen{
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen const uint8_t *p = data, *end = p + size;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen uint32_t crc = (uint32_t)-1;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen for (; p != end; p++)
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen crc = (crc >> 8) ^ crc32tab[((crc ^ *p) & 0xff)];
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen return crc;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen}
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainen
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainenuint32_t crc32_str(const char *str)
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainen{
db24d60c306c9d477392ff5b61cb3fc95fef3bb7Timo Sirainen const uint8_t *p = (const uint8_t *)str;
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen uint32_t crc = (uint32_t)-1;
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen
2e03303e721a293d796c0287829396f5caea76eaTimo Sirainen for (; *p != '\0'; p++)
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainen crc = (crc >> 8) ^ crc32tab[((crc ^ *p) & 0xff)];
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen return crc;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen}
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen