123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- classdef CRC32 < handle
- %CRC32 Class for calculating CRC32s
- % For Quick Reference, see http://en.wikipedia.org/wiki/Cyclic_redundancy_check
- % CRC32 implementation adapted from: http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net
-
-
- properties (SetAccess = private, GetAccess = private)
- table
- end
-
- properties (Constant = true, GetAccess = public)
- DefaultPolynomial = hex2dec('edb88320');
- DefaultSeed = hex2dec('ffffffff');
- end
-
- properties (SetAccess = private, GetAccess = public)
- Polynomial
- Seed
- Hash
- end
-
- methods (Access = public)
-
- function this = CRC32(aPolynomial, aSeed)
- if nargin < 2
- aSeed = CRC32.DefaultSeed;
- end
- if nargin < 1
- aPolynomial = CRC32.DefaultPolynomial;
- end
- this.Polynomial = cast(aPolynomial, 'uint32');
- this.Seed = cast(aSeed, 'uint32');
- this.table = CRC32.InitializeTable(this.Polynomial);
- this.Initialize();
- end
-
- function Initialize(this)
- this.Hash = cast(this.Seed, 'uint32');
- end
-
- function crc = Compute(this, bytes, start, size)
- if nargin < 3
- start = 1;
- end
- if nargin < 4
- size = length(bytes) - start + 1;
- end
- crc = bitxor(... %This is Just a bitwise not
- CRC32.DefaultSeed,...
- this.CalculateHash(this.table, this.Seed, bytes, start, size));
- end
-
- end
-
- methods (Access = private, Static = true)
-
- function createTable = InitializeTable(aPolynomial)
-
- polynomial = cast(aPolynomial, 'uint32');
- createTable = cast(zeros(256, 0), 'uint32');
-
- for i = 0 : 255
- entry = cast(i, 'uint32');
- for j = 0 : 7
- if bitand(entry, uint32(1)) == uint32(1)
- entry = bitxor( (bitshift(entry, -1)) , polynomial);
- else
- entry = (bitshift(entry, -1));
- end
-
- end
- createTable(i + 1) = entry;
- end
- end
-
- function crc = CalculateHash(table, seed, buffer, start, size)
- crc = seed;
- crcspace = (1:size) + (start - 1);
- for i = crcspace
- lookup = cast( bitand(...
- bitxor(buffer(i) , crc), ...
- 255), 'uint8');
- crc = bitxor(...
- bitshift(crc , -8) , ...
- table(uint16(lookup) + 1));
- end
- end
- end
- end
|