1

我正在转换一个将 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 编码的源程序。我发现该逻辑没有任何问题,然后我发现了数据从网络流转换为字符串并随后转换为字节/整数数组的函数的来源。以下是代码

 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。

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

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

2 回答 2

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();
    }
于 2012-07-27T15:33:34.807 回答
0

这是一个类似的问题,它有几种不同的方式。

这是一个网站,它对您所面对的事物进行了极好的详细描述。

它不应该那么难,但是将它们处理为 int 会更加困难。

Zoned Decimal (BCD) 的转换非常简单,但是如果您从大型机中获取文件,这些文件已经通过 ASCII 传输进行了转换,则必须小心。它仍然可以转换,但是由于 FTP 期间 ebcdic 到 ascii 的转换,字节值会发生变化。

如果您处理二进制文件,则处理起来要容易得多。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestZoned
{
  class Program
  {
    public static String zoneToString(byte[] zoneBytes)
    {
        Encoding ascii = Encoding.ASCII;
        Encoding ebcdic = Encoding.GetEncoding("IBM037");
        byte[] asciiBytes = null;
        String str = null;

        int zoneLen = zoneBytes.Length;
        int i = zoneLen - 1;
        int b1 = zoneBytes[i];
        b1 = (b1 & 0xf0) >> 4;

        switch (b1)
        {
            case 13:
            case 11:
                zoneBytes[i] = (byte)(zoneBytes[i] | 0xf0);
                asciiBytes = Encoding.Convert(ebcdic, ascii, zoneBytes);

                str = "-" + ASCIIEncoding.ASCII.GetString(asciiBytes);
                break;

            default:
                zoneBytes[i] = (byte)(zoneBytes[i] | 0xf0);
                asciiBytes = Encoding.Convert(ebcdic, ascii, zoneBytes);

                str = ASCIIEncoding.ASCII.GetString(asciiBytes);
                break;
        }

        return (str);
    }

    static void Main(string[] args)
    {
        byte[] array =  { 0xf0, 0xf0, 0xf1 }; // 001
        byte[] pos = { 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9 }; // 123456789
        byte[] neg = { 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xd9 }; // -123456789

        Console.WriteLine("Converted: {0}", zoneToString(array));
        Console.WriteLine("Converted: {0}", zoneToString(pos));
        Console.WriteLine("Converted: {0}", zoneToString(neg));
    }
}

}

于 2012-07-27T14:44:01.797 回答