byte[]和int型的互轉


這種轉換有有意義的,比如可以將多個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中對非托管代碼操作的一個封裝類。用這種方法,比直接用指針操作安全一點。

比較下來,這四種方法中,前兩種較為簡單。


免責聲明!

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



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