校验值的计算----移位算法

一直以来都是从互联网获得知识,感觉没贡献过什么。

 

最近做项目研究了一个算法,就写一个共享出来,给需要的人一些参考。

 

说明:

有一个40字节的数组,前38个字节表示数据,后两个字节表示校验值。

校验值是前面38字节之和。

 

如果前面38个字节全部是0xFF(255),则255*38 = 9690   => 0x25DA

 

也就是说,即使前面38个字节都是最大的值,后面两个字节也是能保存校验值的结果。

 

计算校验值是很简单的,你可以直接相加,也可以用for循环相加。

 

问题是怎么分离结果。假如校验值是0x35DA,那么我们要把Arr[38] = 0x25,Arr[39] = 0xDA。

 

我所解决的就是这个问题。

 

下面直接看代码吧。

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{


	BYTE Arr[40] = {0};

	// 数组赋值。。。。
	

	// 计算校验值
	WORD wTemp = 0;
	for (int i=0; i<38; i++)
	{
		wTemp += Arr[i];
	}

	Arr[38] = wTemp>>8; 
	Arr[39] = wTemp<<8>>8;

	return 0;
}

看代码就简单多了,首先有一个四十字节的数组。

我们要把前面38个字节的和,放入第39个字节和第40个字节。

校验值高位存储在第39字节,校验值低位存储在第40个字节。

一、将校验值的高位存储在第39个字节

      那么,这一步是怎么实现的呢,我们以0x25DA为例,它的十六进制为 0010 0101 1101 1010,占16bit。

如果它右移8bit,就会变成 0000 0000 0010 0101,这时,校验值的高位就跑到低位来了。

我们把它强制转换为BYTE类型,就变成了0010 0101,这个我们就可以存储在第39个字节了。

二、将校验值的低位存储在第40个字节

实现了高位的复制,低位也是类似的方法。

0x25DA,十六进制0010 0101 1101 1010,先左移8bit,变成1101 1010 0000 0000

这时候0xDA跑到了高位,然后我们再把它右移到低位,变成了0000 0000 1101 1010,

然后强制转换类型为BYTE,低位复制就完成了。

 

The End!

posted @ 2013-11-05 15:41  r3call  阅读(1327)  评论(0编辑  收藏  举报