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中对非托管代码操作的一个封装类。用这种方法,比直接用指针操作安全一点。
比较下来,这四种方法中,前两种较为简单。