大學的時候學習位運算,當時不知道有什麼實際用處, 因此難有深入的理解。如今知道在網絡傳輸的時候,總時要傳輸字節流的,好比一個int64類型的數據,若是打包成字節數組,又如何字節數組中解包出來呢?c#
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
仍是先看代碼: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()分片處理方式更加高效。擴展