パック10進へ変換する

ホストのCOBOLデータ形式で、パック10進へ変換する方法。形式にもいろいろありますが、ここでは
「123」→「0x123C」
「-4321」→「0x04321D」
符号が最後につきます。Cが+、Dが−です。


Int64 num;
try
{
num = Convert.ToInt64(元になる数字の文字列);
}
catch
{
MessageBox.Show("数値ではありません。");
return;
}


int fugo; //符号部分 Cは+、Dは− マイナスの場合は+にしておく
if (num < 0) {
fugo = 0x0D;
num = num * -1;
} else {
fugo = 0x0C;
}
string strNum = num.ToString();

double d = Math.Ceiling((strNum.Length +1) / 2.0);//符号分1足して2で割る あまりを切り上げバイト数を求める(丸め誤差が気になるが?)
int byteLen = Convert.ToInt32(d);
byte[] bytes = new byte[byteLen];
for (int i = 0;i < bytes.Length;i++)
bytes[i] = 0x00; //00で初期化
bool state = true;
int lowByte = fugo;
int bLen = bytes.Length;

for (int i = strNum.Length -1; i >= 0; i--) {
if (state) {
bLen--;
int highByte = Convert.ToInt32(strNum[i].ToString());
int waByte = )((highByte << 4) | (lowByte))(;//上位を4ビットシフトして、論理和を求めて1バイトにする
bytes[bLen] = Convert.ToByte(waByte);
state = false;
}
else {
lowByte = Convert.ToInt32(strNum[i].ToString());
state = true;
}
}
if (state) {
bLen--;
int highByte = 0x00;
int waByte = )((highByte << 4) | (lowByte))(;
bytes[bLen] = Convert.ToByte(waByte);
}


FileStream fs = new FileStream(@"C:\xxx\xxx.TXT", FileMode.Create, FileAccess.Write, FileShare.Write);//ファイルに書き込む

BinaryWriter bw = new BinaryWriter(fs);
bw.Write(bytes);
bw.Close();
fs.Close();

return bytes;//戻り値byte[]

Convertが多いし、効率は悪そうですが。。。(泣