int 轉byte[]的相關方法和應用場景


    在c#中把int轉成byte[]一般都會使用BitConverter.GetBytes可以獲取得到,但BitConverter有個問題就是每次調用都會產生一個新byte[];如果你比較執着的話以下提供兩種方式可以省下這一些。

    從BitConverter中把代碼偷取出來,加功一下:),先看下BitConverter.GetBytes關於int的方法

1 public unsafe static byte[] GetBytes(int value)
2 {
3 byte[] array = new byte[4];
4 fixed (byte* ptr = array)
5 {
6 *(int*)ptr = value;
7 }
8 return array;
9 }

    可以改成如下:

 1   public class IntToBytes2
2 {
3 private byte[] m4byteData = new byte[4];
4
5 public unsafe byte[] ToBytes(int value)
6 {
7 fixed (byte* ptr = m4byteData)
8 {
9 *(int*)ptr = value;
10 }
11 return m4byteData;
12 }
13 }

  還有一種是通過定義一個結構

 1     public class IntToBytes1
2 {
3 private byte[] m4byteData = new byte[4];
4 private Switcher mData;
5 public byte[] ToBytes(int value)
6 {
7 mData.intVal = value;
8 m4byteData[0] = mData.b0;
9 m4byteData[1] = mData.b1;
10 m4byteData[2] = mData.b2;
11 m4byteData[3] = mData.b3;
12 return m4byteData;
13 }
14 [StructLayout(LayoutKind.Explicit)]
15 struct Switcher
16 {
17 [FieldOffset(0)]
18 public int intVal;
19 [FieldOffset(0)]
20 public byte b0;
21 [FieldOffset(1)]
22 public byte b1;
23 [FieldOffset(2)]
24 public byte b2;
25 [FieldOffset(3)]
26 public byte b3;
27 }
28 }

  其實還有一種就是通過移位來實現,這里就不多說。

  簡單測試一下效果,建議編譯成Release然后單獨運行exe看情況,如果不是結果可能有比較大的出入

 1 IntToBytes1 t1 = new IntToBytes1();
2 IntToBytes2 t2 = new IntToBytes2();
3 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
4 sw.Reset();
5 sw.Start();
6 for (int i = 0; i < 9999999; i++)
7 {
8 BitConverter.GetBytes(i);
9 }
10 sw.Stop();
11 Console.WriteLine(sw.Elapsed.TotalMilliseconds);
12 sw.Reset();
13 sw.Start();
14 for (int i = 0; i < 9999999; i++)
15 {
16
17 t1.ToBytes(i);
18 }
19 sw.Stop();
20 Console.WriteLine(sw.Elapsed.TotalMilliseconds);
21 sw.Reset();
22 sw.Start();
23 for (int i = 0; i < 9999999; i++)
24 {
25
26 t2.ToBytes(i);
27 }
28 sw.Stop();
29 Console.WriteLine(sw.Elapsed.TotalMilliseconds);

  運行結果分別是208ms,148ms和150ms。從結果上來看自定義的兩種似乎要快,細心的朋友看到后應該發現這樣的測試似乎不公平;首先BitConverter方法本身是線程安全的,而其他兩者並不是;如果其他兩種方式在每次使用的時候都定義那出來的結果就完全不一樣了,估計BitConverter是最高效的(有興趣的朋友可以方式下)。如果自定義的方式在定義后使用一定的次數顯然是比BitConverter來的得價值,如在網絡通訊時針對一個連接來分配后面的所有轉換都使用他這樣價值就能體現出來。

  其實在.net framework里不僅公是BitConverter存在這情況,在我們特別常用Encoding.GetBytes都是通過這方式來處理,還有string.toCharArray等在高密集的處理時都會大量地構建新的byte[]和char[].如果你比較關心這些細節不防多看下這些對象的方法,然后通過某些途勁把這些問題解決。這不僅僅能夠提高一點處理效率還能解放一些GC的工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM