51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
 | |
|  *
 | |
|  *  Use of this source code is governed by a BSD-style license
 | |
|  *  that can be found in the LICENSE file in the root of the source
 | |
|  *  tree. An additional intellectual property rights grant can be found
 | |
|  *  in the file PATENTS.  All contributing project authors may
 | |
|  *  be found in the AUTHORS file in the root of the source tree.
 | |
|  */
 | |
| 
 | |
| #include "rtc_base/crc32.h"
 | |
| 
 | |
| #include "rtc_base/arraysize.h"
 | |
| 
 | |
| namespace rtc {
 | |
| 
 | |
| // This implementation is based on the sample implementation in RFC 1952.
 | |
| 
 | |
| // CRC32 polynomial, in reversed form.
 | |
| // See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
 | |
| static const uint32_t kCrc32Polynomial = 0xEDB88320;
 | |
| 
 | |
| static uint32_t* LoadCrc32Table() {
 | |
|   static uint32_t kCrc32Table[256];
 | |
|   for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) {
 | |
|     uint32_t c = i;
 | |
|     for (size_t j = 0; j < 8; ++j) {
 | |
|       if (c & 1) {
 | |
|         c = kCrc32Polynomial ^ (c >> 1);
 | |
|       } else {
 | |
|         c >>= 1;
 | |
|       }
 | |
|     }
 | |
|     kCrc32Table[i] = c;
 | |
|   }
 | |
|   return kCrc32Table;
 | |
| }
 | |
| 
 | |
| uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
 | |
|   static uint32_t* kCrc32Table = LoadCrc32Table();
 | |
| 
 | |
|   uint32_t c = start ^ 0xFFFFFFFF;
 | |
|   const uint8_t* u = static_cast<const uint8_t*>(buf);
 | |
|   for (size_t i = 0; i < len; ++i) {
 | |
|     c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
 | |
|   }
 | |
|   return c ^ 0xFFFFFFFF;
 | |
| }
 | |
| 
 | |
| }  // namespace rtc
 |