[.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コード(シンプルですが、コンパイルのオプションを変更する必要があります)
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;
[zz]http://www.teeta.com/ttweb/User/ly4cn/2005-04/19572.html
intとbyte[]の相互変換について、Mattias Sjogrenは3つの方法を紹介しています.「IntegerをByte Arayに変換」を参照してください.実は多くの方法があるはずです.ここではMattias Sjogrenを含む4つの方法をまとめました.
1.最も一般的な方法
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;