byte[]とint型の相互回転

8042 ワード

このような変換は、例えば、複数の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);// 

マーシャルクラスはNetにおける非管理コード操作のパッケージクラス.この方法では、直接ポインタで操作するよりも安全です.
比較すると、この4つの方法のうち、前の2つは簡単です.