[.NET]intとbyte[]の相互変換【転】


[.NET]intとbyte[]の相互変換
 
[zz]http://www.teeta.com/ttweb/User/ly4cn/2005-04/19572.html
    intとbyte[]の相互変換について、Mattias Sjogrenは3つの方法を紹介しています.「IntegerをByte Arayに変換」を参照してください.実は多くの方法があるはずです.ここではMattias Sjogrenを含む4つの方法をまとめました.
1.最も一般的な方法
  • byte[]からuint b=new byte[]{0 xfe、0 x 5 a、0 x 11,0 xfa];u=(uint)(b[0]|b[1]<<8|b[2]<<16|b[3]<<24);
  • intからbyte[]b[0]=(byte)(u);b[1]=(byte)(u>>8)b[2]=(byte)(u>>16)b[3]=(byte)(u>>24)
  • 2.BitConverterを使用する(強力おすすめ)
  • intからbyte[]b=BitConverter.GetByttesまで(   0 xba 5 eba 11)//{0 x 11,0 xba、0 x 5 e、0 xba}
  • byte[]からintuint u=BitConverter.ToUID nt 32(   new byte[]{0 xfe,0 x 5 a,0 x 11,   0 xfa},0)//0 xfa115 afe
  • 3.Unsafeコード(シンプルですが、コンパイルのオプションを変更する必要があります)
    unsafe {
    // int byte[]
    fixed ( byte* pb = b ) 
    //  byte[]   int








    u = *((uint*)pb);
    }
    4.   Marshal 
        IntPtr ptr=Marksharl.AllocHGlobal(4)/.非ホストメモリを割り当てるには    byte[]b=new byte[4]{1,2,3,4}byte[]からintまで    Masharl.C.opy(b,0,ptr,4)    int u=Masharl.ReadInt 32(ptr)//intからbyte[]まで    Marsharl.WriteInt 32(ptr,u)    Marksharl.Coopy(ptr,b,0,4)    Masharl.FreeHGlobal(ptr)//最後にメモリをリリースしてください.
        4つ目を使うのは面倒そうですが、実際には、構造をbyte[]に変換するなら、4つ目が便利です.たとえば:
        int len=Masharl.SizOf(typeof(MyStruct)    MyStruct o;    byte[]arr=new byte[len]//{…};
        IntPtr ptr=Marksharl.AllocHGlobal(len)    try    {//byte[]からstruct MyStructまで     Masharl.Copy(arr,index,ptr,Math.Min(length,arr.Length-index);     o=(MyStruct)Masharl.PtrtoStructure(ptr,typeof(MyStruct);
    //struct MyStructからbyte[]     Marksharl.Structure ToPtr(o,ptr,true)//使う時はfDeleteOldパラメータに注意してください.     Masharl.Copy(ptr,arr,0,len)    }    finally    {     Masharl.FreeHGlobal(ptr)    }    return o;