我正在转换一个将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);
}
答案 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();
}