BCDデータをASCIIに変換するJavaクラスを変換しています
.NetBCDConvertorに変換しています
以下はJavaから変換されたものですが、間違った変換値を示しています。たとえば、123456789の場合は123456153153を示しています。
public static string GetStringFromBcd(int[] b)
{
StringBuilder buffer = new StringBuilder();
foreach (var t in b)
{
if ((t & 0x0000000F) == 0x0000000F && ((t >> 4) & 0x0000000F) == 0x0000000F)
{
break;
}
buffer.Append((t & 0x0000000F) + "");
if ((t & 0x000000F0) != 0x000000F0)
{
buffer.Append(((t >> 4) & 0x0000000F) + "");
}
}
}
何が問題なのですか?
編集:答え:
データがBCDでエンコードされたソースプログラムを入手しました。そのロジックには何も問題がないことがわかり、データがネットワークストリームから文字列に変換され、後でbyte/int配列に変換される関数のソースを発見しました。以下はコードです
int bytesRead = tcpClient.Receive(message);//, 0, bytetoReadSize);
if (bytesRead == 0)
{
break;
//the client has disconnected from the server
}
//message has successfully been received
data += new ASCIIEncoding().GetString(message, 0, bytesRead);
ここに問題があります。ASCIIEncodingは多くのエンコードされた文字を変換せず、それらの文字の代わりに'?' 63を返します。BCD変換ロジックに63を入れると、153が得られます。
このエラーを解決するために、最後の行を変更し、デコードする代わりに、受信したバイトをcharにキャストするだけです。
foreach (byte b in message)
{
data += ((char) b);
}