• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "rtc_base/crc32.h"
12 
13 #include "rtc_base/arraysize.h"
14 
15 namespace rtc {
16 
17 // This implementation is based on the sample implementation in RFC 1952.
18 
19 // CRC32 polynomial, in reversed form.
20 // See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
21 static const uint32_t kCrc32Polynomial = 0xEDB88320;
22 
LoadCrc32Table()23 static uint32_t* LoadCrc32Table() {
24   static uint32_t kCrc32Table[256];
25   for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) {
26     uint32_t c = i;
27     for (size_t j = 0; j < 8; ++j) {
28       if (c & 1) {
29         c = kCrc32Polynomial ^ (c >> 1);
30       } else {
31         c >>= 1;
32       }
33     }
34     kCrc32Table[i] = c;
35   }
36   return kCrc32Table;
37 }
38 
UpdateCrc32(uint32_t start,const void * buf,size_t len)39 uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
40   static uint32_t* kCrc32Table = LoadCrc32Table();
41 
42   uint32_t c = start ^ 0xFFFFFFFF;
43   const uint8_t* u = static_cast<const uint8_t*>(buf);
44   for (size_t i = 0; i < len; ++i) {
45     c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
46   }
47   return c ^ 0xFFFFFFFF;
48 }
49 
50 }  // namespace rtc
51