zoukankan      html  css  js  c++  java
  • 校验值的计算----移位算法

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

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

    说明:

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

  • 相关阅读:
    PeCheck
    模拟木马
    青柠网络验证
    青柠网络验证一键合成工具(exe程序和网络验证合成)
    如果想看我以前发的文章,请到下面地址查看
    星空QQ音乐下载2.0 (可下载收费音乐)
    vmp分析文章
    星空QQ群1.0模块
    青柠网络验证
    Java之IO操作总结
  • 原文地址:https://www.cnblogs.com/tk091/p/3408676.html
Copyright © 2011-2022 走看看