首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请高手解释一下代码含义,该如何解决

2012-03-22 
请高手解释一下代码含义最近看一个图象识别的例子,但对其中两个函数不理解请高手们解释一下:这两个函数的

请高手解释一下代码含义
最近看一个图象识别的例子,但对其中两个函数不理解
请高手们解释一下:这两个函数的含义,实现原理,
还有那个Table为什么如此定义?
如果分不够,可以另开贴加分
const
    Table:   array[0..255]   of   Cardinal   =
    ($00000000,   $77073096,   $EE0E612C,   $990951BA,
        $076DC419,   $706AF48F,   $E963A535,   $9E6495A3,
        $0EDB8832,   $79DCB8A4,   $E0D5E91E,   $97D2D988,
        $09B64C2B,   $7EB17CBD,   $E7B82D07,   $90BF1D91,
        $1DB71064,   $6AB020F2,   $F3B97148,   $84BE41DE,
        $1ADAD47D,   $6DDDE4EB,   $F4D4B551,   $83D385C7,
        $136C9856,   $646BA8C0,   $FD62F97A,   $8A65C9EC,
        $14015C4F,   $63066CD9,   $FA0F3D63,   $8D080DF5,
        $3B6E20C8,   $4C69105E,   $D56041E4,   $A2677172,
        $3C03E4D1,   $4B04D447,   $D20D85FD,   $A50AB56B,
        $35B5A8FA,   $42B2986C,   $DBBBC9D6,   $ACBCF940,
        $32D86CE3,   $45DF5C75,   $DCD60DCF,   $ABD13D59,
        $26D930AC,   $51DE003A,   $C8D75180,   $BFD06116,
        $21B4F4B5,   $56B3C423,   $CFBA9599,   $B8BDA50F,
        $2802B89E,   $5F058808,   $C60CD9B2,   $B10BE924,
        $2F6F7C87,   $58684C11,   $C1611DAB,   $B6662D3D,

        $76DC4190,   $01DB7106,   $98D220BC,   $EFD5102A,
        $71B18589,   $06B6B51F,   $9FBFE4A5,   $E8B8D433,
        $7807C9A2,   $0F00F934,   $9609A88E,   $E10E9818,
        $7F6A0DBB,   $086D3D2D,   $91646C97,   $E6635C01,
        $6B6B51F4,   $1C6C6162,   $856530D8,   $F262004E,
        $6C0695ED,   $1B01A57B,   $8208F4C1,   $F50FC457,
        $65B0D9C6,   $12B7E950,   $8BBEB8EA,   $FCB9887C,
        $62DD1DDF,   $15DA2D49,   $8CD37CF3,   $FBD44C65,
        $4DB26158,   $3AB551CE,   $A3BC0074,   $D4BB30E2,
        $4ADFA541,   $3DD895D7,   $A4D1C46D,   $D3D6F4FB,
        $4369E96A,   $346ED9FC,   $AD678846,   $DA60B8D0,
        $44042D73,   $33031DE5,   $AA0A4C5F,   $DD0D7CC9,
        $5005713C,   $270241AA,   $BE0B1010,   $C90C2086,
        $5768B525,   $206F85B3,   $B966D409,   $CE61E49F,
        $5EDEF90E,   $29D9C998,   $B0D09822,   $C7D7A8B4,
        $59B33D17,   $2EB40D81,   $B7BD5C3B,   $C0BA6CAD,

        $EDB88320,   $9ABFB3B6,   $03B6E20C,   $74B1D29A,
        $EAD54739,   $9DD277AF,   $04DB2615,   $73DC1683,
        $E3630B12,   $94643B84,   $0D6D6A3E,   $7A6A5AA8,
        $E40ECF0B,   $9309FF9D,   $0A00AE27,   $7D079EB1,
        $F00F9344,   $8708A3D2,   $1E01F268,   $6906C2FE,
        $F762575D,   $806567CB,   $196C3671,   $6E6B06E7,


        $FED41B76,   $89D32BE0,   $10DA7A5A,   $67DD4ACC,
        $F9B9DF6F,   $8EBEEFF9,   $17B7BE43,   $60B08ED5,
        $D6D6A3E8,   $A1D1937E,   $38D8C2C4,   $4FDFF252,
        $D1BB67F1,   $A6BC5767,   $3FB506DD,   $48B2364B,
        $D80D2BDA,   $AF0A1B4C,   $36034AF6,   $41047A60,
        $DF60EFC3,   $A867DF55,   $316E8EEF,   $4669BE79,
        $CB61B38C,   $BC66831A,   $256FD2A0,   $5268E236,
        $CC0C7795,   $BB0B4703,   $220216B9,   $5505262F,
        $C5BA3BBE,   $B2BD0B28,   $2BB45A92,   $5CB36A04,
        $C2D7FFA7,   $B5D0CF31,   $2CD99E8B,   $5BDEAE1D,

        $9B64C2B0,   $EC63F226,   $756AA39C,   $026D930A,
        $9C0906A9,   $EB0E363F,   $72076785,   $05005713,
        $95BF4A82,   $E2B87A14,   $7BB12BAE,   $0CB61B38,
        $92D28E9B,   $E5D5BE0D,   $7CDCEFB7,   $0BDBDF21,
        $86D3D2D4,   $F1D4E242,   $68DDB3F8,   $1FDA836E,
        $81BE16CD,   $F6B9265B,   $6FB077E1,   $18B74777,
        $88085AE6,   $FF0F6A70,   $66063BCA,   $11010B5C,
        $8F659EFF,   $F862AE69,   $616BFFD3,   $166CCF45,
        $A00AE278,   $D70DD2EE,   $4E048354,   $3903B3C2,
        $A7672661,   $D06016F7,   $4969474D,   $3E6E77DB,
        $AED16A4A,   $D9D65ADC,   $40DF0B66,   $37D83BF0,
        $A9BCAE53,   $DEBB9EC5,   $47B2CF7F,   $30B5FFE9,
        $BDBDF21C,   $CABAC28A,   $53B39330,   $24B4A3A6,
        $BAD03605,   $CDD70693,   $54DE5729,   $23D967BF,
        $B3667A2E,   $C4614AB8,   $5D681B02,   $2A6F2B94,
        $B40BBE37,   $C30C8EA1,   $5A05DF1B,   $2D02EF8D);

uses
    Main;

{$R   *.dfm}

//输出CRCValue
procedure   CalcCRC32(P:   Pointer;   ByteCount:   Cardinal;   var   CRCValue:   Cardinal);
var
    I:   Cardinal;
    q:   ^Byte;
begin
    q   :=   P;
    for   I   :=   0   to   ByteCount   -   1   do
    begin
        CRCValue   :=   (CRCValue   shr   8)   xor   Table[q^   xor   (CRCValue   and   $000000FF)];
        inc(q);
    end
end;

procedure   CalcStreamCRC32(BmpCompare:   TBitmap;   var   CRCValue:   Cardinal;   var   TotalBytes:   TInteger8;   var   error:   Word);
var
    BmpStream:   TMemoryStream;
begin
    BmpStream   :=   TMemoryStream.Create;

    BmpCompare.Monochrome   :=   True;
    BmpCompare.SaveToStream(BmpStream);
    error   :=   0;
    CRCValue   :=   $FFFFFFFF;


    try
        if   BmpStream.Size   >   0   then
            CalcCRC32(BmpStream.Memory,   BmpStream.Size,   CRCValue)
    except
        on   E:   EReadError   do
            error   :=   1
    end;
    CRCValue   :=   not   CRCValue;

    BmpStream.Free;
end;

[解决办法]
Table是一个HASH表
for I := 0 to 255 do
begin
vCRC := I;
for J := 1 to 8 do
if Odd(vCRC) then
vCRC := (vCRC shr 1) xor $EDB88320
else vCRC := vCRC shr 1;
vCRC32Table[I] := vCRC;
end;
CRC32的Table是通过上面的算法得到的,用空间换时间,所以这个部分被省略了

HASH运算的特点就是将不定长的数据处理成定长的数据
比如:
crc16就是将不定长数据处理成16个字位(2个字节、Word类型)
crc32就是将不定长数据处理成32个字位(4个字节、Cardinal\Longword类型)
md5则是将不定长数据处理成128个字位(16个字节)

使用码表和异或运算,是为了使运算结果据不规则性
即:不定长数据中任意改变一个字节,就会得到完全不同的结果
这样运算不具可逆性 //和压缩算法不同

利用这样的特性,一般用来做数据的验证(加密)用
如:避免数据在网络上传输中途被改写或检查物理介质上存储的数据是否出现破损等
[解决办法]
procedure CalcCRC32(P: Pointer; ByteCount: Cardinal; var CRCValue: Cardinal);
//功能描述: 计算一个缓冲区所有数据的CRC32值
//入口参数:
// P - 指向这个缓冲区的指针
// ByteCount - 缓冲区的大小(字节数)
//出口参数:
// CRCValue - 用于返回计算出的CRC32值

热点排行