C# 指定され「文字」のバイト配列から「BCD に変換した数値」のバイト配列を生成

BCD = Binary-Coded Decimal
文字を整数に変換するメソッド: atoi
文字のバイト配列を BCD(数値)の配列へ変換するメソッド: MakeBCD
色々なパターンで BCD 変換(メインメソッド): DoMakeBCD
class Program
{
    // ASCII to Integer.
    // アスキー(文字)の '0' ~ '9', 'A' ~ 'F' ('a' ~ 'f')を
    // 整数 0x00(0) ~ 0x0f(15) に変換する
    static byte atoi( byte src )
    {
        if( false )
        {
        }
        else if( src >= '0' && src <= '9' )
        {
            src -= (byte)'0';
        }
        else if( src >= 'A' && src <= 'F' )
        {
            src -= (byte)'A' - 10;
        }
        else if( src >= 'a' && src <= 'f' )
        {
            src -= (byte)'a' - 10;
        }
        else
        {
            src = 0;
        }
 
        return src;
    }
 
    // 指定されバイト配列から BCD に変換したバイト配列を生成する
    // このバイト配列の要素は '0' ~ '9', 'A' ~ 'F' ('a' ~ 'f') で
    // 構成されていること。この値以外は '0' として処理する
    static byte[] MakeBCD( byte[] src )
    {
        // 長さを偶数にする(2 バイトで 1 バイトを表すため)
        int nCount = src.Length & ~1;
 
        // 奇数/偶数を求める(奇数は 1 、偶数 0)
        int nOne = src.Length & 1;
 
        // 出力用のバイト配列を生成
        // 出力用のバイト配列の長さは元の半分。奇数は 1 追加する
        byte[] dst = new byte[(nCount >> 1) + nOne];
 
        int nDstIndex = 0;
 
        for( int i = 0; i < nCount; i += 2 )
        {
            byte nValue = 0;
 
            // 2 バイトで 1 バイトを表す処理
            // まず、各バイトを整数に変換する
            // 1 バイト目を上位 4 ビットにする
            // 2 バイト目を下位 4 ビットにする
 
            nValue |= (byte)(atoi( src[i + 0] ) << 4);
            nValue |= (byte)(atoi( src[i + 1] ) << 0);
 
            dst[nDstIndex] = nValue;
 
            nDstIndex ++;
        }
 
        // 奇数の場合、残りの 1 バイトを処理する
        if( nOne != 0 )
        {
            dst[nDstIndex] = (byte)(atoi( src[nCount] ) << 4);
        }
 
        return dst;
    }
 
    static void DoMakeBCD()
    {
        // A は new byte[] {} となる(長さ 0 のバイト配列)
        byte[] A = MakeBCD( new byte[] {} );
 
        // B は new byte[] { 0x90 } となる
        byte[] B = MakeBCD( new byte[] { (byte)'9' } );
 
        // C は new byte[] { 0x56 } となる
        byte[] C = MakeBCD( new byte[] { (byte)'5', (byte)'6' } );
 
        // D は new byte[] { 0xAB, 0xC0 } となる
        byte[] D = MakeBCD( new byte[] { (byte)'A', (byte)'B', (byte)'C' } );
 
        // E は new byte[] { 0xAB, 0xC0 } となる
        byte[] E = MakeBCD( new byte[] { (byte)'a', (byte)'b', (byte)'c' } );
    }
 
    static void Main( string[] args )
    {
        DoMakeBCD();
    }
}