數據的打包與解包-整數與Byte數組的相互轉換

前言

大學的時候學習位運算,當時不知道有什麼實際用處, 因此難有深入的理解。如今知道在網絡傳輸的時候,總時要傳輸字節流的,好比一個int64類型的數據,若是打包成字節數組,又如何字節數組中解包出來呢?c#

Int64變量轉字節數組

C#的擴展方法以下:數組

public static byte[] ToByteArray4(this long val)
        {
            var byte0 = Convert.ToByte(val >> 24);  //右移3個字節
            var byte1 = Convert.ToByte(val >> 16 & 0xFF); //是右移2字節,去除高位
            var byte2 = Convert.ToByte(val >> 8 & 0xFF );
            var byte3 = Convert.ToByte(val & 0xFF );
            return new byte[] { byte0, byte1,byte2,byte3 };
        }

解釋一下,這裏時把長整型轉換爲4字節。實際上長整型對應的是8字節長度,可是經常使用4字節的正數,範圍已足夠平常使用,因此Int64轉成4字節很常見。 上面的代碼也很清楚, 在不考慮超4字符範圍的狀況下:網絡

第一個字節的值,便是長整型數據右移3個字節,即24位的值;學習

第二個字節的值,便是右移2字節,去除高位,只保留最後一個字節的值。this

其它字節原理相同。code

字節數組轉Int64

仍是先看代碼:class

public static long ToInt64(this Span<byte> bytes)
        {
            long val = 0;
            for (int i = 0; i < bytes.Length; i++)
            {
                val +=   bytes[i] << ((bytes.Length - i - 1)*8) ;
            }
            return val;
        }

Span<byte> 是應用的c#的新特性,針對數組的AsSpan()轉換後,能夠經過Slice方法高效的截取想要處理的字節流片斷。 上面的bytes,在7個字節之內均可以高效正確的轉換爲Int64變量。變量

號外:關於字節流處理的討論

字節流實現上在程序裏要轉換成字節數組, 在這個轉換過程當中,會有包的拆分問題, 關於拆包問題,不一樣的協議處理方法不一樣。原理

對於字節數組,在原數組須要儘快釋放的時候,應經過 Buffer.BlockCopy 方法複製出想要處理的數據,進行處理。 在原數組不須要儘快釋放的時候,新的AsSpan()分片處理方式更加高效。擴展

相關文章
相關標籤/搜索