byte[]とint型の相互回転
8042 ワード
このような変換は、例えば、複数の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);//
マーシャルクラスはNetにおける非管理コード操作のパッケージクラス.この方法では、直接ポインタで操作するよりも安全です.
比較すると、この4つの方法のうち、前の2つは簡単です.
//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);
//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);//
マーシャルクラスはNetにおける非管理コード操作のパッケージクラス.この方法では、直接ポインタで操作するよりも安全です.
比較すると、この4つの方法のうち、前の2つは簡単です.
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);
}
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);//
マーシャルクラスはNetにおける非管理コード操作のパッケージクラス.この方法では、直接ポインタで操作するよりも安全です.
比較すると、この4つの方法のうち、前の2つは簡単です.