天天看點

DWORD WORD到INT的轉換

最近在做一個有關TCP/TP通信的消息解析,涉及到了這方面的轉換,記錄一下。

首先,如果是在網絡傳輸、消息解析的情況下,要注意一下網絡傳送使用的是大端還是小端模式,這影響到我們的高低位的傳輸順序。

 WORD&&DWORD

  WORD: 無符号雙位元組整形(字,16位)

  DWORD:無符号四位元組整形 (雙字,32位)

Byte:8位

解析方式

  采用Java位操作來實作(采用大端方式,故先傳遞高位,則接收方低位為高)

//轉換DWORD到整型資料
    private int DWORDtoInt(byte[] sourceArr,int start){
        //len=4,inArr為擷取到的4位Byte數組
        byte[] intArr=spiltByteArr(sourceArr,start,4);
        return intArr[0]<<24|intArr[1]<<16|intArr[2]<<8|intArr[3];
    }

    //轉換WORD到整形資料
    private int WORDtoInt(byte[] sourceArr,int start){
        //len=2,intArr為擷取到的2為Byte數組
        byte[] intArr=spiltByteArr(sourceArr,start,2);
        return intArr[0]<<8|intArr[1];
    }           

複制

Java 位操作(參考部落格:https://blog.csdn.net/lazyman_54/article/details/51283459)

簡介

說到位運算,自然說的全部都是二進制運算,相信大家都比較熟悉,但我還是要說明(啰嗦)一下,java裡int型是4個位元組,即32位,用二進制表示java裡的1就是000……0001,這些都是有符号的數,也就是最高位代表符号位,也就是32位能表示的最大整數是2的32次方-1.下面舉得栗子,我不會自己為難自己,搞十幾位數,所有都是二位數,所有隻用一個位元組,且最高依然代表符号位。

& 與運算符

與運算符就相當于&&,不同的是,這是按位對比,比如8&9,用十進制的眼光去看簡直就瞎了,8&9其實做的運算就是00001000&00001001,然後看到當且僅當兩個對應的位置都是1,結果才是1,否則結果為0,那麼結果就是00001000,也就是8. 

那麼,這個運算有什麼卵用麼?答案是當然有啦,比如,我們現在都是用int去做标志位,比如1代表正常,0代表異常,那如果我們用二進制來做的話,不就很爽了麼,0001代表正常0010代表異常,0100代表XXX,是不是想想都有點小激動·····

| 或運算符

或運算符就相當于||, 當然也是按位去或的,當且僅當兩個對應的位置都是0,結果才是0,否則結果是1,那麼8|9就是00001000|00001001,結果就是00001001=9。至于這個有什麼用,我就不贅述了,有規則就會有用,就這麼簡單·····

~運算符

非運算符是又得講一下的,了解起來很容易的,就是按位取反,比如~8對吧,那就是00001000按位取反結果是11110111.前面說了,這是有符号數,也就是最高位代表符号位,也就是~8的結果是一個負數,那麼人類第一反應是-8,但結果卻不是,那這裡簡單解析一下,負數的二進制表示方式跟正數不一樣,負數有一個反碼和補碼的概念,這麼了解呢?就說-8吧,用二進制表示-8是:11111000,-10的二進制是:11110110. 

首先-8的絕對值8的二進制是00001000, 求其反碼就是11110111,補碼(+1)是11111000。那麼上面~8的結果11110111是多少呢?我們算一下,先-1得到11110110,然後取反:00001001,得到9,那麼~8==9?不是的,是結果的絕對值,因為是負數,是以是-9.這個結果大家可以去驗證下~~~

^異或運算符

異或運算是:當運算符兩邊不同的時候結果為1,兩邊相同的時候結果為0 這就是傳說中的同性相殺,異性相吻。舉個例子就是:8^6=1000^0110=1110=14

>>位移運算符(<<同理)

位移運算符我們可以簡單的了解為乘除法,像左移是除法,向右移是乘法。這個符号位是不移動的,注意下。8>>2大家不要了解為8/2,位移兩位就是除以2的2次方也就是8/4.這裡注意9>>1的結果是4,即最低位的1會移沒了··當然了<<如果結果超過了最大整數能表示的範文,那就·····你懂的。

>>> 這個應該是無符号的位移運算符

這個運算符跟>>差不多,不同點是,它移動後高位補0,。好像>>位移後高位也是補0啊,是的,但符号位不移動,而>>>tm符号位都移動了,就是負數一移就正了·····