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


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

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

    说明:

    有一个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!

  • 相关阅读:
    Error Boundaries 错误边界
    判断机型
    iframe
    C#中静态方法和非静态方法的区别
    C#制作ActiveX控件中调用海康SDK的问题
    C# 程序集
    web deploy 部署网站
    C# 提取PPT文本和图片的实现方案
    C#调用webservice
    C#中四步轻松使用log4net记录本地日志
  • 原文地址:https://www.cnblogs.com/tk091/p/3408676.html
Copyright © 2020-2023  润新知