Buffer.BlockCopy使います?
ネットの会議室を見てたらbyte[ ]をushort[ ]へ変換する方法についてBinaryReaderを使う以外*1ないかという質問がありました。C/C++を知っている人だとunsafeを使ってbyte*からushort*へキャストしたりするかも知れません。もし、unsafeが使えないとしたら、どうすればよいでしょうか?
#region Using directives using System; #endregion class Program { static void Main(string args) { short sa = new short { 32767, -32768, -32767, -1}; Console.Write("short :"); foreach (short s in sa) Console.Write("{0:X4} ,", s); Console.WriteLine(); // short配列をushort配列にコピー ushort ua = new ushort[sa.Length]; Buffer.BlockCopy(sa, 0, ua, 0, sizeof(short) * sa.Length); Console.Write("ushort:"); foreach (ushort u in ua) Console.Write("{0},", u); Console.WriteLine(); // ushort配列をbyte配列にコピー byte[] ba = new byte[sizeof(short) * sa.Length]; Buffer.BlockCopy(ua, 0, ba, 0, ba.Length); Console.Write("byte :"); foreach (byte b in ba) Console.Write("{0:X2},", b); Console.WriteLine(); Console.ReadLine(); } } /* 結果 short :7FFF ,8000 ,8001 ,FFFF , ushort:32767,32768,32769,65535, byte :FF,7F,00,80,01,80,FF,FF, */
BufferクラスのBlockCopyを使えば、Cライブラリで言うところのmemcpyみたいなことが出来ます。わたしゃ、BlockCopyメソッドの引数countをずっと要素数のことだと思っていたのですが、今日初めてバイト数だと気づきました。要素数だったら、Array.Copyと同じになってしまうよね〜(^^;
あ、サンプルでは肝心のbyte[ ]→ushort[ ]をやってない。でも気にしない〜(^^;
*1:BitConverterは取りあえず置いておく