校验值的计算----移位算法
一直以来都是从互联网获得知识,感觉没贡献过什么。
最近做项目研究了一个算法,就写一个共享出来,给需要的人一些参考。
说明:
有一个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!