雁过请留痕...
代码改变世界

byte[]和int型的互转

2012-09-28 17:41  xiashengwang  阅读(3986)  评论(0编辑  收藏  举报

这种转换有有意义的,比如可以将多个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中对非托管代码操作的一个封装类。用这种方法,比直接用指针操作安全一点。

比较下来,这四种方法中,前两种较为简单。