C# 指定され「文字」のバイト配列から「BCD に変換した数値」のバイト配列を生成
BCD = Binary-Coded Decimal
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();
}
}