byte[]數(shù)組和int之間的轉(zhuǎn)換

前段時(shí)間在工作中遇到一個(gè)問(wèn)題,將整數(shù)作為數(shù)據(jù)傳輸,因?yàn)閿?shù)據(jù)包留給我們的字節(jié)數(shù)也不多,所以需要將int類(lèi)型轉(zhuǎn)化為byte[]存放。需要注意的是在java和C#中,byte的取值范圍并不一致。
這里貼出C#代碼,java的實(shí)現(xiàn)是一樣的。

int轉(zhuǎn)字節(jié)數(shù)組
/// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        private static byte[] Int32ToBytes(uint number)
        {
            //int numCopy = number;
            byte[] bs = new byte[4];
            byte a = (byte)(number >> 24);
            byte b = (byte)((number & 0xff0000) >> 16);
            byte c = (byte)((number & 0xff00) >> 8);
            byte d = (byte)(number & 0xff);
            bs[0] = a;
            bs[1] = b;
            bs[2] = c;
            bs[3] = d;
            return bs;
        }

unit為無(wú)符號(hào)整型,可表示0-(2^32-1)的整數(shù),byte類(lèi)型可表示0~255的整數(shù)。用二進(jìn)制表示unit是32位,byte為8位,所以將unit的劃分為4個(gè)8位分別byte中就可以了。

byte a = (byte)(number >> 24);

將number右移24位,只留下最高8位,放入a中,這里int轉(zhuǎn)byte還需要一個(gè)強(qiáng)轉(zhuǎn)。

byte b = (byte)((number & 0xff0000) >> 16);

將number的最高8位置0,第二高8位右移到最低8位,放入到b中,c、d也是這樣賦值。

字節(jié)數(shù)組轉(zhuǎn)int
private static uint BytesToInt32(byte[] bs)
        {
            if (bs == null || bs.Length != 4)
            {
                throw new EncryptionException(ErrorCode.defaultCode, "傳入數(shù)組長(zhǎng)度不為4");
            }
            //獲取最高八位
            uint num1 = 0;
            num1 = (uint)(Convert.ToInt32(num1) ^ (int)bs[0]);
            num1 = num1 << 24;
            //獲取第二高八位
            uint num2 = 0;
            num2 = (uint)(Convert.ToInt32(num2) ^ (int)bs[1]);
            num2 = num2 << 16;
            //獲取第二低八位
            uint num3 = 0;
            num3 = (uint)(Convert.ToInt32(num3) ^ (int)bs[2]);
            num3 = num3 << 8;
            //獲取低八位
            uint num4 = 0;
            num4 = (uint)(Convert.ToInt32(num4) ^ (int)bs[3]);
            return num1 ^ num2 ^ num3 ^ num4;
        }

byte轉(zhuǎn)int的思路,先將每個(gè)byte位轉(zhuǎn)為一個(gè)32位的整數(shù),再將4個(gè)整數(shù)做異或,這樣就把4個(gè)8位放到一個(gè)整數(shù)當(dāng)中。

總結(jié)

byte和int類(lèi)型在計(jì)算機(jī)底層其實(shí)都是用二進(jìn)制表示的,這樣看其實(shí)byte和int只是長(zhǎng)度不一樣的一個(gè)二進(jìn)制數(shù)而已。需要注意的是在C#中byte和unit都是無(wú)符號(hào)的整數(shù),所以右移并不存在問(wèn)題,左邊位補(bǔ)0就行,但是如果有負(fù)數(shù)的話,符號(hào)位是要補(bǔ)1的。

?著作權(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)容

  • 忙碌的生活工作,總會(huì)有很多事等著我們?nèi)プ?。工作中每天接打電話、發(fā)微信,參加會(huì)議,進(jìn)行報(bào)表分析,寫(xiě)匯報(bào)材料,還有黨課...
    期盼靜等花開(kāi)閱讀 438評(píng)論 0 0
  • 若志,我的金蘭之交,時(shí)隔多年,我仍心生愧疚,在她不如意的那些年,我因?yàn)樽约旱娜跣?,未能勇敢的挺身而出,陪在她身邊?..
    琰琰521閱讀 153評(píng)論 0 1
  • 20190115日感恩分享 1.今天快遞小哥親自上門(mén)送清潔劑,讓我少跑路了,謝謝謝謝謝謝 2.購(gòu)買(mǎi)的清潔膏效果真好...
    富貴清華閱讀 223評(píng)論 0 0
  • 我有一朋友,是護(hù)士,每次見(jiàn)面,我都有點(diǎn)小忐忑。在我的印象里,大部分醫(yī)護(hù)工作者都有點(diǎn)潔癖,我不太敢隨意坐她的沙發(fā),床...
    色妖妖閱讀 483評(píng)論 0 3
  • 期待的眼神是親人對(duì)你的期盼,期盼你有個(gè)好成績(jī),期盼你可以順利過(guò)關(guān)。期盼的眼神就是最大的力量,幫助我度過(guò)難關(guān),幫助我...
    百合花楊貽宸閱讀 230評(píng)論 0 0

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