日期:2014-05-18 浏览次数:21133 次
public static uint Calculate_Crc(String strData,int len) { uint iCrcVal; int iIndex=0; iCrcVal = 0xffff; //CRC初始值 while(len-- !=0) { iCrcVal = iCrcVal ^ ((uint)(strData[iIndex++]) << 8); for(int i=0;i<8;i++) { if (Convert.ToBoolean(iCrcVal & 0x0001)) iCrcVal = (iCrcVal >> 1) ^ 0xa001; else iCrcVal = iCrcVal >> 1; } } return iCrcVal; }
------解决方案--------------------
不是太懂,帮你顶一下,以表支持
------解决方案--------------------
高深啊!!
去外国网站看看吧!!
------解决方案--------------------
1、
发送数据1010110101100
CRC参数 10101
生成CRC校验码100
接受数据1010110101100-100/10101可以整除表示验证通过
通俗一点,传送一个数123456789,为了验证传送过程,我找一个除数17,然后余数1作为校验码。
传送123456789,17,1到另外一个地方,如果是123456786,17,1,那将产生错误。
现在一个问题诞生了,这样也没有太大加强系统的安全度,顶多是17倍,打住!真的只安全了17倍吗?!
假设一只小鸟1秒内被雷击中的几率是1/100,一只小鸟1秒内被小孩儿弹弓击中的几率是1/100,一只小鸟一秒内被噎死的几率是1/100
请问,一只小鸟一秒内被噎死,同时雷电和弹弓又同时击中的几率是多少?答案肯定不是1/300
因此,CRC参数的长度对于校验的准确度提升是指数级的。
2、关于stream,我想就是数据流,是不是字符串,怎么说呢?谁能保证stream里面没有英文字符的编码就没有中文字符?没有中文字符就没有阿拉伯文?
就没有我创建一种编码的字符串?我觉得这是两个不同的概念。不是非此即彼的关系。
大家都会相信,任意一个stream串都可以构造成字符串形式,只是构造的规则由谁定的问题。
如果非要解决这个问题,那就尽量搞清楚编码规则,特别是头尾格式。
------解决方案--------------------
首先定义全局变量
char MYCRC[16]={0x11,0x11,0x11,0x11...};//16个0x11
然后再找一个CRC算法,简单点就直接模二加
代码:
fopen(EXE文件),只读打开
BYTE crc = 0;
for(int i=0;i<filelen;i++)
crc = crc ^ filedata[i];
if( crc != MYCRC[0] )
{
ShowMessage("crc error");
return;
}
编译OK,得到EXE文件。
再另外新建立一个工程,名字叫getcrc.prj,专门统计某个文件的模二加值,代码参考:
fopen(EXE文件),只读打开
BYTE crc = 0;
for(int i=0;i<filelen;i++)
crc = crc ^ filedata[i];
用UTRLEDIT或者其他HEX编辑器打开你的EXE文件,
寻找一串0x11,0x11,0x11...的东西
找到后把第一个0x11和第二个0x11都改为你用getcrc.exe得到你的EXE文件的CRC值。
(以上仅供楼主您参考)
------解决方案--------------------
首先定义全局变量
char MYCRC[16]={0x11,0x11,0x11,0x11...};//16个0x11
然后再找一个CRC算法,简单点就直接模二加
代码:
fopen(EXE文件),只读打开
BYTE crc = 0;
for(int i=0;i<filelen;i++)
crc = crc ^ filedata[i];
if( crc != MYCRC[0] )