重赏高手!

lxm75 2006-08-03 12:38:58
我从网络上搜集了大量关于CRC32的计算,可没有一个能正确计算出我想要的结果,我不知道到底我错在哪里,故将代码传上来,请高手指点!
鄙人无以回报,只能许诺将自己完全自主开发并已销售在百宝箱上线的游戏完整原代码(KJava的代码,与C语言语法相似,得此代码您将可以轻松地编写出同种类型游戏)真诚地奉献给您!

我整理的代码如下:
// crc3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdio.h>
//---------------------------------------------------------------------------
//算法四
static unsigned long crc32_table4[256]; // Lookup table array
static unsigned long Reflect(unsigned long ref, char ch)
{
// Used only by Init_CRC32_Table().

unsigned long value = 0;

// Swap bit 0 for bit 7
// bit 1 for bit 6, etc.
int i;
for(i = 1; i < (ch + 1); i++)
{
if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
}

void Init_CRC32_Table()
{
// Call this function only once to initialize the CRC table.

// This is the official polynomial used by CRC-32
// in PKZip, WinZip and Ethernet.
unsigned long ulPolynomial = 0x04c11db7;

// 256 values representing ASCII character codes.
int i, j;
for(i = 0; i <= 0xFF; i++)
{
crc32_table4[i] = Reflect(i, 8) << 24;
for (j = 0; j < 8; j++)
crc32_table4[i] = (crc32_table4[i] << 1) ^ (crc32_table4[i] & (1UL << 31) ? ulPolynomial : 0);
crc32_table4[i] = Reflect(crc32_table4[i], 32);
}
}

unsigned long Get_CRC32(unsigned char *pdata, int len)
{
// Pass a text string to this function and it will return the CRC.

// Once the lookup table has been filled in by the two functions above,
// this function creates all CRCs using only the lookup table.

// Be sure to use unsigned variables,
// because negative values introduce high bits
// where zero bits are required.

// Start out with all bits set high.
unsigned long ulCRC = 0xffffffff;

// Perform the algorithm on each character
// in the string, using the lookup table values.
while(len--)
ulCRC = (ulCRC >> 8) ^ crc32_table4[(ulCRC & 0xFF) ^ (unsigned char)(*pdata++)];
// Exclusive OR the result with the beginning value.
return ulCRC ^ 0xffffffff;
}
//---------------------------------------------------------------------------
...全文
342 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenchure 2006-08-06
  • 打赏
  • 举报
回复
jf
snowbirdfly 2006-08-04
  • 打赏
  • 举报
回复
呵呵~
接分~~~
lxm75 2006-08-04
  • 打赏
  • 举报
回复
请本帖所有来过的兄弟在去一趟这个帖,还有额外的分加给大家!非常感谢大家!
http://community.csdn.net/Expert/topic/4924/4924247.xml?temp=.4931909
lxm75 2006-08-04
  • 打赏
  • 举报
回复
方法3和4是正确的,大家可以下载回去保存!
lxm75 2006-08-04
  • 打赏
  • 举报
回复
朋友们,问题解决了,是被一高人一语道破的,结帖,这位高手将得到游戏代码。
我啃 2006-08-04
  • 打赏
  • 举报
回复
看了头大,只有JF
hhyytt 2006-08-04
  • 打赏
  • 举报
回复
我试试看。
lxm75 2006-08-03
  • 打赏
  • 举报
回复
将以上代码按顺序直接复制到VC++中即可运行。
lxm75 2006-08-03
  • 打赏
  • 举报
回复
unsigned long Table_CRC[256];

//算法一——构造 32 位 CRC 表
void BuildTable32( unsigned long aPoly )
{
unsigned long i, j;
unsigned long nData;
unsigned long nAccum;

//String str;

//Memo1->Clear();
for ( i = 0; i < 256; i++ )
{
nData = ( unsigned long )( i << 24 );
nAccum = 0;
for ( j = 0; j < 8; j++ )
{
if ( ( nData ^ nAccum ) & 0x80000000 )
nAccum = ( nAccum << 1 ) ^ aPoly;
else
nAccum <<= 1;
nData <<= 1;
}
Table_CRC[i] = nAccum;

//str = IntToStr(i)+", "+(nAccum);
//Memo1->Lines->Add(str);
}
}

//---------------------------------------------------------------------------
//算法一——计算 32 位 CRC-32 值
unsigned long CRC_32( unsigned char * aData, unsigned long aSize )
{
unsigned long i;
unsigned long nAccum = 0xffffffff;

for ( i = 0; i < aSize; i++ )
nAccum = ( nAccum << 8 ) ^ Table_CRC[( nAccum >> 24 ) ^ (*aData++)];
//nAccum = ( nAccum >> 8 ) ^ Table_CRC[( nAccum & 0xFF ) ^ (*aData++)];
//nAccum = ( nAccum >> 8 ) ^ Table_CRC[( nAccum ^ (*aData++)) & 0xFF ];

return nAccum^ 0xffffffff;
}

//---------------------------------------------------------------------------
void main()
{
unsigned long crc1,crc2,crc3,crc4;

unsigned char testcrc[8]={
0x00, 0x00, 0x00, 0x00,
0x49, 0x45, 0x4E, 0x44,
}; //这是png文件IEND部分固定的数据
//这是该段固定的CRC = (byte)0xAE, (byte)0x42, (byte)0x60, (byte)0x82

/*
//列出另一IDAT数据块
unsigned char testcrc1[47]={
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x27,
(byte)0x49, (byte)0x44, (byte)0x41, (byte)0x54,
(byte)0x78, (byte)0x9c, (byte)0x63, (byte)0x38,
(byte)0xbd, (byte)0xb2, (byte)0x3d, (byte)0x95,
(byte)0x61, (byte)0xd7, (byte)0x8c, (byte)0xb2,
(byte)0x10, (byte)0x06, (byte)0x20, (byte)0xc3,
(byte)0x99, (byte)0x01, (byte)0xc8, (byte)0x30,
(byte)0x62, (byte)0x00, (byte)0x32, (byte)0x14,
(byte)0x19, (byte)0x80, (byte)0x0c, (byte)0x01,
(byte)0x06, (byte)0x10, (byte)0x83, (byte)0x01,
(byte)0xc4, (byte)0x00, (byte)0x00, (byte)0x24,
(byte)0xa7, (byte)0x0b, (byte)0xa4
};
//最后的CRC应该是DA 12 06 A5
*/
//算法一
unsigned long cnCRC_32 = 0x04C11DB7;

BuildTable32(cnCRC_32);
crc1 = CRC_32( &testcrc[0], 8);
printf("%04x\n",crc1);


//算法二
ISO_13818_CRC32 *iso;

iso = new ISO_13818_CRC32();
iso->update(&testcrc[0], 8);
crc2 = iso->get_value();
printf("%04x\n",crc2);

//算法三
crc3 = CalcCRC32(&testcrc[0], 8);
printf("%04x\n",crc3);

//算法四
Init_CRC32_Table();
crc4 = Get_CRC32(&testcrc[0], 8);
printf("%04x\n",crc4);
}
//---------------------------------------------------------------------------
lxm75 2006-08-03
  • 打赏
  • 举报
回复
//算法三
unsigned long CalcCRC32(unsigned char* pData, unsigned long dwSize)
{
// CRC32 Table
static const unsigned long c_crc32_table[256] = {
0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,
0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,
0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,
0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,
0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,
0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,
0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,
0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,
0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,
0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,
0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,
0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,
0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,
0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,
0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,
0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,
0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D,
};

// Be sure to use unsigned variables,
// because negative values introduce high bits
// where zero bits are required.
unsigned long crc(0xffffffff);

// in the string, using the lookup table values.
while(dwSize--)
crc = (crc >> 8) ^ c_crc32_table[(crc & 0xFF) ^ *pData++];
// Exclusive OR the result with the beginning value.
return crc ^ 0xffffffff;
}
//---------------------------------------------------------------------------

//算法二
class ISO_13818_CRC32
{
public:
ISO_13818_CRC32();
void update(unsigned char* data, long length);
unsigned long get_value();
private:
void process_byte(unsigned char b);
unsigned char pump_bit(unsigned char b, int bit_pos);
void decode_crc(unsigned char bit);

unsigned long crc_reg;
unsigned long poly;

};

ISO_13818_CRC32::ISO_13818_CRC32()
{
crc_reg = 0xffffffff;
poly = 0x4c11db7;
}

void ISO_13818_CRC32::decode_crc(unsigned char bit)
{
unsigned char add;
add = ( (crc_reg & 0x80000000) ? 1 : 0 ) ^ bit;//crc_reg最高位与bit的异或
crc_reg <<= 1;

if (add)
{
crc_reg ^= poly;
}
}

unsigned long ISO_13818_CRC32::get_value()
{
return crc_reg ^ 0xffffffff;
}

void ISO_13818_CRC32::process_byte(unsigned char b)
{
for (int i = 0; i < 8; i++)
{
decode_crc(pump_bit(b, 7 - i));
}
}

unsigned char ISO_13818_CRC32::pump_bit(unsigned char b, int bit_pos)
{//返回b的第8-bit_pos位(从高位到低位)
if (bit_pos >= 0 && bit_pos <= 7)
{
if (b & (1 << bit_pos))
{
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}

void ISO_13818_CRC32::update(unsigned char* data, long length)
{
crc_reg = 0xffffffff;

for (int i = 0; i < length; i++)
{
process_byte(data[i]);
}
}

//---------------------------------------------------------------------------
lxm75 2006-08-03
  • 打赏
  • 举报
回复
兄弟们,这次我是放血求救了,那套游戏可是价值3万多的呀,不是小游戏,引擎式开发的,你拿去后对编写同类型游戏很有帮助哟!
所以它的价值是不可低估的!!!!!!!
chenhu_doc 2006-08-03
  • 打赏
  • 举报
回复
即使接分。
lxm75 2006-08-03
  • 打赏
  • 举报
回复
兄弟们,我的问题是用所有算发得出的结果都不是我想要的,我在验证png的IEND字段,应该得到的CRC我附在文件后了,朋友们可以试试你们的代码,看看结果是不是那几个固定的值。
kangji 2006-08-03
  • 打赏
  • 举报
回复
楼主是什么问题?
是算法错了,还是你算出来的结果,跟其他算法算出来的结果不同?
jigangwang 2006-08-03
  • 打赏
  • 举报
回复
手上有一个前辈写的原来
看对lz有用乎
#ifndef _BUA_ARITHMETIC_HPP_
#define _BUA_ARITHMETIC_HPP_

//#include <base/BuaObject.hpp>

// -----------------------------------------------------------------------------
class BuaCRC32
{
// ---------------------------------
public :
BuaCRC32( void ){ }

// ---------------------------------
unsigned long operator( )( void *v_buffer, int count ) const;
unsigned long operator( )( const char* v_str ) const;

// ---------------------------------
private :
static unsigned long ms_crc32_table[256];
};

// -----------------------------------------------------------------------------
#endif


#include <BuaArithmetic.h>

// -----------------------------------------------------------------------------
unsigned long BuaCRC32::ms_crc32_table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };

// -----------------------------------------------------------------------------
unsigned long
BuaCRC32::operator()( void *v_buffer, int v_count ) const
{
unsigned long crc = -1;
unsigned long temp1, temp2;
unsigned char *p = (unsigned char *)v_buffer;

while ( v_count-- != 0 )
{
temp1 = ( crc >> 8 ) & 0x00FFFFFFL;
temp2 = ms_crc32_table[ ( ( int ) crc ^ *p++ ) & 0xFF ];
crc = temp1 ^ temp2;
}

return ( crc^0xFFFFFFFF );
}

// -----------------------------------------------------------------------------
unsigned long
BuaCRC32::operator()( const char* v_str ) const
{
unsigned long crc = -1;
unsigned long temp1, temp2;
unsigned char *p = ( unsigned char *)v_str;

while ( '\0' != *( ( char* )p ) )
{
temp1 = ( crc >> 8 ) & 0x00FFFFFFL;
temp2 = ms_crc32_table[ ( ( int ) crc ^ *p++ ) & 0xFF ];
crc = temp1 ^ temp2;
}

return ( crc^0xFFFFFFFF );
}

#include <iostream>
#include <string>
#include "BuaArithmetic.h"
using namespace std;

int main(int argc,char ** argv)
{
BuaCRC32 m_crc;
int ret = m_crc("123test");
cout<<"123test"<<ret<<endl;
ret = m_crc("123test");
cout<<"123test"<<ret<<endl;

return 0;
}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧