六號(hào)線晚報(bào)0529

天氣:陰轉(zhuǎn)晴 風(fēng)力:微風(fēng)

byte組合byte[]

  1. System.arraycopy()
  2. Arrays.copyOf() 內(nèi)部使用#1實(shí)現(xiàn),原理是新建一個(gè)大的字節(jié)數(shù)組,再?gòu)?fù)制進(jìn)去
  3. 直接初始化byte[] bytes = {byte1, byte2, byte3};

byte[]與其他基本類型互轉(zhuǎn)

  • 轉(zhuǎn)自http://491569462-qq-com.iteye.com/blog/2054551

  • byte[]轉(zhuǎn)基本類型實(shí)質(zhì)是根據(jù)要轉(zhuǎn)的類型循環(huán)取每一字節(jié)按位置偏移8、16、24等,并通過(guò)&0xFF、&0xFFFF、&0xFFFFFF去除高位1后 “|” 操作組合,最后輸出或者通過(guò)Float.intBitsToFloat(),Double.longBitsToDouble()等轉(zhuǎn)為所需類型

  • 基本類型轉(zhuǎn)byte[]實(shí)質(zhì)是先轉(zhuǎn)為int、long等可又16進(jìn)制表示的類型(Float.floatToIntBits()等),然后通過(guò)byteValue()取最高位的一個(gè)字節(jié),再向右偏移8位取下一個(gè)字節(jié)

public class BytesCodec {

    //Byte和int之間的轉(zhuǎn)換

    /**
     * 將32位的int值放到4字節(jié)的里
     *
     * @param num
     * @return
     */
    public static byte[] int2byteArray(int num) {
        byte[] result = new byte[4];
        result[0] = (byte) (num >>> 24);//取最高8位放到0下標(biāo)
        result[1] = (byte) (num >>> 16);//取次高8為放到1下標(biāo)
        result[2] = (byte) (num >>> 8); //取次低8位放到2下標(biāo)
        result[3] = (byte) (num);      //取最低8位放到3下標(biāo)
        return result;
    }

    /**
     * 將4字節(jié)的byte數(shù)組轉(zhuǎn)成一個(gè)int值
     *
     * @param b
     * @return
     */
    public static int byteArray2int(byte[] b) {
        byte[] a = new byte[4];
        int i = a.length - 1, j = b.length - 1;
        for (; i >= 0; i--, j--) {//從b的尾部(即int值的低位)開(kāi)始copy數(shù)據(jù)
            if (j >= 0)
                a[i] = b[j];
            else
                a[i] = 0;//如果b.length不足4,則將高位補(bǔ)0
        }
        int v0 = (a[0] & 0xff) << 24;//&0xff將byte值無(wú)差異轉(zhuǎn)成int,避免Java自動(dòng)類型提升后,會(huì)保留高位的符號(hào)位
        int v1 = (a[1] & 0xff) << 16;
        int v2 = (a[2] & 0xff) << 8;
        int v3 = (a[3] & 0xff);
        return v0 + v1 + v2 + v3;
    }


    //short和byte的互轉(zhuǎn)

    /**
     * 轉(zhuǎn)換short為byte
     *
     * @param b
     * @param s     需要轉(zhuǎn)換的short
     * @param index
     */
    public static void putShort(byte b[], short s, int index) {
        b[index + 1] = (byte) (s >> 8);
        b[index + 0] = (byte) (s >> 0);
    }

    /**
     * 通過(guò)byte數(shù)組取到short
     *
     * @param b
     * @param index 第幾位開(kāi)始取
     * @return
     */
    public static short getShort(byte[] b, int index) {
        return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
    }


    //byte和char類型的轉(zhuǎn)換

    /**
     * 字符到字節(jié)轉(zhuǎn)換
     *
     * @param ch
     * @return
     */
    public static void putChar(byte[] bb, char ch, int index) {
        int temp = (int) ch;
        // byte[] b = new byte[2];
        for (int i = 0; i < 2; i++) {
            // 將最高位保存在最低位
            bb[index + i] = new Integer(temp & 0xff).byteValue();
            temp = temp >> 8; // 向右移8位
        }
    }

    /**
     * 字節(jié)到字符轉(zhuǎn)換
     *
     * @param b
     * @return
     */
    public static char getChar(byte[] b, int index) {
        int s = 0;
        if (b[index + 1] > 0)
            s += b[index + 1];
        else
            s += 256 + b[index + 0];
        s *= 256;
        if (b[index + 0] > 0)
            s += b[index + 1];
        else
            s += 256 + b[index + 0];
        char ch = (char) s;
        return ch;
    }


    //byte和float的轉(zhuǎn)換

    /**
     * float轉(zhuǎn)換byte
     *
     * @param bb
     * @param x
     * @param index
     */
    public static void putFloat(byte[] bb, float x, int index) {
        // byte[] b = new byte[4];
        int l = Float.floatToIntBits(x);
        for (int i = 0; i < 4; i++) {
            bb[index + i] = new Integer(l).byteValue();
            l = l >> 8;
        }
    }

    /**
     * 通過(guò)byte數(shù)組取得float
     *
     * @param b
     * @param index
     * @return
     */
    public static float getFloat(byte[] b, int index) {
        int l;
        l = b[index + 0];
        l &= 0xff;
        l |= ((long) b[index + 1] << 8);
        l &= 0xffff;
        l |= ((long) b[index + 2] << 16);
        l &= 0xffffff;
        l |= ((long) b[index + 3] << 24);
        return Float.intBitsToFloat(l);
    }


    //byte和double轉(zhuǎn)換

    /**
     * double轉(zhuǎn)換byte
     *
     * @param bb
     * @param x
     * @param index
     */
    public static void putDouble(byte[] bb, double x, int index) {
        // byte[] b = new byte[8];
        long l = Double.doubleToLongBits(x);
        for (int i = 0; i < 4; i++) {
            bb[index + i] = new Long(l).byteValue();
            l = l >> 8;
        }
    }

    /**
     * 通過(guò)byte數(shù)組取得float
     *
     * @param b
     * @param index
     * @return
     */
    public static double getDouble(byte[] b, int index) {
        long l;
        l = b[0];
        l &= 0xff;
        l |= ((long) b[1] << 8);
        l &= 0xffff;
        l |= ((long) b[2] << 16);
        l &= 0xffffff;
        l |= ((long) b[3] << 24);
        l &= 0xffffffffl;
        l |= ((long) b[4] << 32);
        l &= 0xffffffffffl;
        l |= ((long) b[5] << 40);
        l &= 0xffffffffffffl;
        l |= ((long) b[6] << 48);
        l &= 0xffffffffffffffl;
        l |= ((long) b[7] << 56);
        return Double.longBitsToDouble(l);
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,824評(píng)論 18 399
  • 概述 java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標(biāo)。java.io ...
    Steven1997閱讀 9,443評(píng)論 1 25
  • #終極面試# 有點(diǎn)意思的密室?題材。。。開(kāi)頭看得很劃水,在一個(gè)只有規(guī)則沒(méi)有法律的特殊環(huán)境里,人性的碰撞。 結(jié)局沒(méi)有...
    情煌閱讀 113評(píng)論 0 0
  • “要是我當(dāng)初堅(jiān)持打下去,早就甩他們幾條街了!”這不,朋友又在抱怨昨天晚上玩LOL輸給他基友的慘痛經(jīng)歷,還和我說(shuō)技能...
    ChillChok閱讀 1,788評(píng)論 16 60
  • 今天辦事順利偶遇貴人相助,感謝 動(dòng)起來(lái),也只有動(dòng)起來(lái)才能立起來(lái)!
    呂明超閱讀 96評(píng)論 0 0

友情鏈接更多精彩內(nèi)容