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は取りあえず置いておく