文章目錄
- 2.1 取特定的位(Mask + & + >>)
- 2.2 產生特定的位(Mask + | + >>)
- 2.4 二進位解碼
最近在做協議分析(RTMP),程式裡時常要處理二進位。我網上搜尋了一下,沒有發現對二進位處理技巧的總結或者說明,自己嘗試著總結一下。
1,基礎
電腦在底層基本上都是以二進位來傳遞和儲存的。類似於這樣的序列:
0010 1100, 0001 1101
在使用的時候在把這些二進位翻譯成“有意義”的格式,比如翻譯成英語字母。在表示二進位的時候如果直接用0和1來顯示,那樣會太長,不太好表示。程式中我們一般會將二進位表示成十進位或十六進位。比如上面的二進位就可以表示成:
44, 29 =>十進位
0x2c, 0x1d =>十六進位
因為我們通常將每8位(bits)視為為1個位元組(byte),也就是1byte = 8bits。位元組是電腦傳輸的儲存的大小和邊界,也就是我們通常說的最小單位。為此我們在程式中通常是以8bits來處理,儲存,傳輸二進位的。
在電腦中十六進位和二進位是天然適配的,也就是說每4個二進位(4bits)正好對應一個十六進位的數(從0~F)。所以程式語言中大多數直接支援十六進位字面量的,比如在很多語言中我們可以這樣定義byte(也就是2個4bits):
buf[0] = 0x2c
我們說過每個byte是8bits,這用十進位來表示的話就是0~255,程式設計語言中沒有直接對於的類型來表示這個範圍的數字,所以在C語言中我們用了大小一致的char類型,因為char類型也是8bits來表示的。但我們通常都是處理一串二進位,所以我們還可以用int(4bytes)作為單位大小來表示二進位,這樣一個int值就可以表示4bytes。
2,二進位演算法
我們處理二進位的需求通常有:
1,取特定的一位或幾位(這在協議分析中時常使用)
2,產生特定一位或幾位
2,二進位編碼格式用於傳輸和儲存
3,二進位解碼成特定格式
2.1 取特定的位(Mask + & + >>)
在程式裡使用掩碼(Mask)來取得特定的位,比如對於下面的二進位:
0010 1100
我們如果從左開始的第三位,那麼首先建立這樣的掩碼:0010 0000,也是除了第三位以外都置0。這時我們就可以“按位與”得到具體的一位,再結合移位元運算就可以得到結果:
0010 11000010 0000 &--------------------0010 0000 >> 5 = 0000 0001
如果我們取中間的4位也一樣,先產生掩碼:0011 1100,然後:
0010 11000011 1100 &-------------0010 1100 >> 2 = 0000 1011
2.2 產生特定的位(Mask + | + >>)
產生特定的位也類似,只不過將&換成|。因為0和0或1的“或操作”不影響原來的值。比如,我們想把下面這個二進位從左邊開始的3~5變成010:
0010 1100
我們的演算法分為兩步,第一步先將3~5位置0,為此我們產生掩碼11(00 0)111,然後使用&將中間3~5位置0。置0後我們用掩碼00(01 0)000和
0010 11001100 0111 & => 中間位置0掩碼-------------------0000 0100 => 3~5位已置00001 0000 | => 中間位操作掩碼-------------------0001 0100 =>00(01 0)100 中間已置位的結果
2.3 二進位編碼
既然談到編碼和解碼,那麼在編碼和解碼之間必須達成協議,這個協議我們通常稱為碼錶。在編碼和解碼過程中我們需要查碼錶來編解碼。其實編碼就是中映射,常用的映射有:
8bits => char(ASCII)
32bits, 4bytes => unsigned integer(uint)
比如我們對以下二進位編碼:
0010 1100, 0101 1101, 0011 0001, 0110 1110
結果:
ASCII => ,]1nuint => 744305006
2.4 二進位解碼
解碼和編碼的方式類似,是編碼的逆向操作。
3,程式操作執行個體
待添加…