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

浙公网安备 33010602011771号