将BCD转换代码从Java迁移到.Net

时间:2012-07-26 09:37:46

标签: c# java .net

我正在转换一个将BCD数据转换为ASCII

的Java类

我正在将其转换为.Net BCD转换器

以下是从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而不是那些字符,当把63放在BCD转换逻辑中它给出153。

要解决此错误,我修改了最后一行而不是解码,我只是将接收到的字节转换为char。

 foreach (byte b in message)
 {
     data += ((char) b);
 }

1 个答案:

答案 0 :(得分:0)

如果你想坚持类似的东西

    public static String GetStringFromBcd(byte[] zoneBytes)
    {
        StringBuilder buffer = new StringBuilder();

        int b1 = (zoneBytes[zoneBytes.Length - 1] & 0xf0) >> 4;
        if ( (b1 == 13) || (b1 == 11) ) buffer.Append("-");

        for (int i = 0; i < zoneBytes.Length; i++)
        {
            buffer.Append((zoneBytes[i] & 0x0f));
        }

        return buffer.ToString();
    }