java中byte[ ]和各種數(shù)據(jù)類型的相互轉(zhuǎn)換

1. int 轉(zhuǎn) byte[ ]

    /**
     * 將int轉(zhuǎn)為低字節(jié)在前泻骤,高字節(jié)在后的byte數(shù)組
     */
    public static byte[] intToArrayByLow(int n) {
        byte[] bytes = new byte[4];
        bytes[0] = (byte) (n & 0xff);
        bytes[1] = (byte) (n >>> 8 & 0xff);
        bytes[2] = (byte) (n >>> 16 & 0xff);
        bytes[3] = (byte) (n >>> 24 & 0xff);
        return bytes;
    }

說明:

  • & 0xff (與運(yùn)算):
    1. 兩個bit(1或0)進(jìn)行與運(yùn)算時上煤,如果兩者都為1搀缠,結(jié)果為1绊茧,否則為0,
    2. 而0xff轉(zhuǎn)化為2進(jìn)制為:0000000011111111,
    3. 當(dāng)一個int和 0xff進(jìn)行與運(yùn)算時跌帐,即表示提取這個int的最低八位护戳。
      例如:
int a = 10000;// a的二進(jìn)制為 10011100010000  
int b =  a & 0xff;// a和0xff 與運(yùn)算后践磅,b的二進(jìn)制為 10000,即十進(jìn)制的16  
System.out.println("b的十進(jìn)制="+b);// 輸出16


  • n >>> 8(位運(yùn)算):
    >>8表示右移8位灸异,如果該數(shù)為正府适,則高位補(bǔ)0,若為負(fù)數(shù)肺樟,則高位補(bǔ)1檐春;

    例如:

1. res = 20 >> 2;   
20的二進(jìn)制為 0001 0100,右移2位后為 0000 0101么伯,則結(jié)果就為 res = 5;  
      
2. res = -20 >> 2;  
-20的二進(jìn)制為其正數(shù)的補(bǔ)碼加1疟暖,即 11111111111111111111111111101100,  
右移2位后為 11111111111111111111111111111011,結(jié)果為 res = -5;
      
3. 而對于>>>符號而言:  
不管正負(fù)俐巴,都是右移后高位補(bǔ)0;  
res = 20 >>> 2; 的結(jié)果與 20>>2 相同骨望;  
res = -20 >>> 2;  
-20的二進(jìn)制為 1110 1011,右移2位欣舵,為111010 擎鸠,此時高位補(bǔ)0,即 0011 1010

所以 bytes[1] = (byte) (n >>> 8 & 0xff); 表示 先右移8位缘圈,然后取最低的八位劣光。
也即從右到左,取第9到16位


  • 再特別說明一點(diǎn),上面的轉(zhuǎn)換方法是采用低字節(jié)在前的方式糟把,一開始接觸的時候看著各種協(xié)議文檔寫著“低字節(jié)在前”绢涡,根本不知道是什么意思。
    這里解釋一下低字節(jié)在前的意思遣疯,打個比方雄可,咱們不是說int有4個字節(jié)嗎? 那轉(zhuǎn)成byte數(shù)組就是byte[4]對吧缠犀?
    byte[4]下標(biāo)從0開始到3滞项,0為前面,3為后面夭坪。
    int的4個字節(jié)文判,最右邊的是最低字節(jié),最左邊的是最高字節(jié)室梅。
    那么低字節(jié)在前的意思就是最右邊的字節(jié)存在byte[0]戏仓, 最左邊的字節(jié)存儲在byte[3]

2. byte[] 轉(zhuǎn) int

    /**
     * 低字節(jié)在前的方式獲取int值
     */
    public static int getInt(byte[] b, int offset) {
        int n = 0;
        int len = b.length;
        if (len >= offset + 4) {
            // 低字節(jié)在前
            int byte0 = b[offset] & 0xff; // 最右邊的字節(jié),不需要移位
            int byte1 = b[offset + 1] & 0xff;// 右邊第二個字節(jié)亡鼠,需要左移一個字節(jié)赏殃,8位
            int byte2 = b[offset + 2] & 0xff;// 右邊第三個字節(jié),需要左移兩個字節(jié)间涵,16位
            int byte3 = b[offset + 3] & 0xff;// 最左邊的字節(jié)仁热,需要左移三哥字節(jié),24位
            n = byte0 | byte1 << 8 | byte2 << 16 | byte3 << 24;
        }
        return n;
    }

上面的代碼中勾哩,為什么需要對每個字節(jié)進(jìn)行 & 0xff運(yùn)算呢抗蠢? 不懂的同學(xué)可以參考下面的鏈接學(xué)習(xí)一下。
https://blog.csdn.net/iblade/article/details/73289831

3. short轉(zhuǎn)byte[]

short轉(zhuǎn)成byte[]其實(shí)和 int轉(zhuǎn)byte[]的邏輯一樣思劳,只不過int是四個字節(jié)迅矛,short是兩個字節(jié)。

    /**
     * 將short轉(zhuǎn)為低字節(jié)在前潜叛,高字節(jié)在后的byte數(shù)組
     */
    public static byte[] shortToByteArrayByLow(short n) {
        byte[] bytes = new byte[4];
        bytes[0] = (byte) (n & 0xff);
        bytes[1] = (byte) (n >>> 8 & 0xff);
        return bytes;
    }

4. byte[]轉(zhuǎn)short

    /**
     * @param b      低字節(jié)在前
     * @param offset
     * @return
     */
    public static short getShortByLow(byte[] b, int offset) {
        short n = 0;
        int len = b.length;
        if (len >= offset + 2) {
            // 低字節(jié)在前
            int byte0 = b[offset] & 0xff; // 最右邊的字節(jié)秽褒,不需要移位
            int byte1 = b[offset + 1] & 0xff;// 右邊第二個字節(jié)壶硅,需要左移一個字節(jié),8位
            n = (short) (byte0 | byte1 << 8);
        }
        return n;
    }

5.long轉(zhuǎn)byte[]

long轉(zhuǎn)成byte[]其實(shí)和 int轉(zhuǎn)byte[]的邏輯一樣销斟,只不過int是四個字節(jié)庐椒,long是八個字節(jié)。

    /**
     * long轉(zhuǎn)byte[8]蚂踊,低字節(jié)在前
     */
    public static byte[] longToByteArrayByLow(long n) {
        byte[] bytes = new byte[8];
        bytes[0] = (byte) (n & 0xff);
        bytes[1] = (byte) (n >>> 8 & 0xff);
        bytes[2] = (byte) (n >>> 16 & 0xff);
        bytes[3] = (byte) (n >>> 24 & 0xff);
        bytes[4] = (byte) (n >>> 32 & 0xff);
        bytes[5] = (byte) (n >>> 40 & 0xff);
        bytes[6] = (byte) (n >>> 48 & 0xff);
        bytes[7] = (byte) (n >>> 56 & 0xff);
        return bytes;
    }

6.byte[]轉(zhuǎn)long

注意:要先把每個字節(jié)轉(zhuǎn)成long類型而不是int類型哦约谈,不然后面左移32位以上,會超出int的存儲范圍導(dǎo)致數(shù)據(jù)錯誤悴势。

    /**
     * 將byte數(shù)組轉(zhuǎn)為long
     */
    public static long getLongByLow(byte[] b, int offset) {
        long n = 0;
        int len = b.length;
        if (len >= offset + 8) {
            // 低字節(jié)在前
            long byte0 = b[offset] & 0xff; // 最右邊的字節(jié)窗宇,不需要移位
            long byte1 = b[offset + 1] & 0xff;// 右邊第二個字節(jié)措伐,需要左移一個字節(jié)特纤,8位
            long byte2 = b[offset + 2] & 0xff;// 右邊第三個字節(jié),需要左移兩個字節(jié)侥加,16位
            long byte3 = b[offset + 3] & 0xff;// 最左邊的字節(jié)捧存,需要左移三哥字節(jié),24位
            long byte4 = b[offset + 4] & 0xff;// 最左邊的字節(jié)担败,需要左移三哥字節(jié)昔穴,32位
            long byte5 = b[offset + 5] & 0xff;// 最左邊的字節(jié),需要左移三哥字節(jié)提前,40位
            long byte6 = b[offset + 6] & 0xff;// 最左邊的字節(jié)吗货,需要左移三哥字節(jié),48位
            long byte7 = b[offset + 7] & 0xff;// 最左邊的字節(jié)狈网,需要左移三哥字節(jié)宙搬,56位
            n = byte0 | byte1 << 8 | byte2 << 16 | byte3 << 24 | byte4 << 32 | byte5 << 40 | byte6 << 48 | byte7 << 56;
        }
        return n;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拓哺,隨后出現(xiàn)的幾起案子勇垛,更是在濱河造成了極大的恐慌,老刑警劉巖士鸥,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闲孤,死亡現(xiàn)場離奇詭異,居然都是意外死亡烤礁,警方通過查閱死者的電腦和手機(jī)讼积,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脚仔,“玉大人币砂,你說我怎么就攤上這事〔=模” “怎么了决摧?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我掌桩,道長边锁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任波岛,我火速辦了婚禮茅坛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘则拷。我一直安慰自己贡蓖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布煌茬。 她就那樣靜靜地躺著斥铺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坛善。 梳的紋絲不亂的頭發(fā)上晾蜘,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音眠屎,去河邊找鬼剔交。 笑死,一個胖子當(dāng)著我的面吹牛改衩,可吹牛的內(nèi)容都是我干的岖常。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼葫督,長吁一口氣:“原來是場噩夢啊……” “哼竭鞍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起候衍,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤笼蛛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛉鹿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滨砍,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年妖异,在試婚紗的時候發(fā)現(xiàn)自己被綠了惋戏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡他膳,死狀恐怖响逢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棕孙,我是刑警寧澤舔亭,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布些膨,位于F島的核電站,受9級特大地震影響钦铺,放射性物質(zhì)發(fā)生泄漏订雾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一矛洞、第九天 我趴在偏房一處隱蔽的房頂上張望洼哎。 院中可真熱鬧,春花似錦沼本、人聲如沸噩峦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽识补。三九已至,卻和暖如春郊丛,著一層夾襖步出監(jiān)牢的瞬間李请,已是汗流浹背瞧筛。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工厉熟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人较幌。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓揍瑟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乍炉。 傳聞我的和親對象是個殘疾皇子绢片,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容