校验值的计算----移位算法
一直以來都是從互聯網獲得知識,感覺沒貢獻過什么。
?
最近做項目研究了一個算法,就寫一個共享出來,給需要的人一些參考。
?
說明:
有一個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!
轉載于:https://www.cnblogs.com/tk091/p/3408676.html
總結
以上是生活随笔為你收集整理的校验值的计算----移位算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安金管家联名信用卡权益:保险福利多多
- 下一篇: Codeforces 258B Litt