zoukankan      html  css  js  c++  java
  • 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中对非托管代码操作的一个封装类。用这种方法,比直接用指针操作安全一点。

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

  • 相关阅读:
    Webpack中publicPath设置
    忘记Mysql的root密码怎么办?
    Visual Studio 2015上安装Entity Framework Power Tools
    Ubuntu下安装中文输入法
    Ubuntu如何选择更新源
    Orchard中如何配置远端发布
    .Net缓存管理框架CacheManager
    全新的membership框架Asp.net Identity(2)——绕不过的Claims
    全新的membership框架Asp.net Identity(1)——.Net membership的历史
    泛型使用中,解决类型转换问题
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/2707490.html
Copyright © 2011-2022 走看看