這種轉換有有意義的,比如可以將多個byte型的字段,轉換后放到一個int字段中。例如color的a,r,g,b值,就可以放到一個int中,需要使用的時候,再從int轉換成byte[]數組。它真正的意義還在於給我們提供了另一種存儲數據的思想,它比較類似於位圖存儲法。下面記錄下具體的實現方式。
用位移運算(關鍵在於思想)
//byte[] --> int byte a = 254, r = 240, g = 230, b = 220; int color = a << 24 | r << 16 | g << 8 | b; //int --> byte[] byte a1 = (byte)(color >> 24); byte r1 = (byte)(color >> 16); byte g1 = (byte)(color >> 8); byte b1 = (byte)(color);
使用BitConverter類(最簡單)
//byte[] --> int byte a = 254, r = 240, g = 230, b = 220; int color = BitConverter.ToInt32(new byte[] { a, r, g, b }, 0); //int --> byte[] byte[] bytes = BitConverter.GetBytes(color); byte a1 = bytes[0]; byte r1 = bytes[1]; byte g1 = bytes[2]; byte b1 = bytes[3];
用C#里的不安全代碼(指針) (不推薦)
unsafe { int i; byte a = 254, r = 240, g = 230, b = 220; byte[] bytes = new byte[] { a, r, g, b }; //byte[] --> int fixed (byte* pb = bytes) { i = *((int*)pb); } //int -->byte[] byte* br = (byte*)&i; byte a1 = *br; byte r1 = *(br + 1); byte g1 = *(br + 2); byte b1 = *(br + 3); }
使用指針,還要開啟編譯選項,允許不安全代碼。
使用Marshal類
byte a = 254, r = 240, g = 230, b = 220; byte[] bytes = new byte[] { a, r, g, b }; IntPtr ptr = Marshal.AllocHGlobal(4); //從byte[] 到 int Marshal.Copy(bytes, 0, ptr, 4);//核心是用Copy函數 int i = Marshal.ReadInt32(ptr);//IntPtr轉為int //從int 到 byte[] byte[] resultBytes = new byte[4]; Marshal.WriteInt32(ptr, i);//int先轉為IntPtr Marshal.Copy(ptr, resultBytes, 0, 4);//核心是用Copy函數 byte a1 = resultBytes[0]; byte r1 = resultBytes[1]; byte g1 = resultBytes[2]; byte b1 = resultBytes[3]; Marshal.FreeHGlobal(ptr);//釋放內存
Marshal類是.net中對非托管代碼操作的一個封裝類。用這種方法,比直接用指針操作安全一點。
比較下來,這四種方法中,前兩種較為簡單。