Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将BCD转换代码从Java迁移到.Net_C#_Java_.net - Fatal编程技术网

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

C# 将BCD转换代码从Java迁移到.Net,c#,java,.net,C#,Java,.net,我正在转换一个将BCD数据转换为ASCII的Java类 我正在将其转换为.Net BCD转换器 以下是从java转换而来的,但它给出了错误的转换值,例如,对于123456789,它给出了12345613153 public static string GetStringFromBcd(int[] b) { StringBuilder buffer = new StringBuilder(); foreach (var t in b) { if ((t &

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

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

以下是从java转换而来的,但它给出了错误的转换值,例如,对于123456789,它给出了12345613153

 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);
这里的问题是,当将63放入BCD转换逻辑中时,ASciencoding不会转换许多编码字符并给出“?”63而不是这些字符,它给出153

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

 foreach (byte b in message)
 {
     data += ((char) b);
 }
这里有一个类似的例子,它是通过几种不同的方式实现的

这里有一个很好的例子,详细描述了你面对的是什么

这应该没那么难,但将它们作为int进行处理会困难得多

分区十进制(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));
    }
}


}

如果你想坚持做类似的事情

    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();
    }
公共静态字符串GetStringFromBcd(字节[]zoneBytes)
{
StringBuilder缓冲区=新的StringBuilder();
intb1=(zoneBytes[zoneBytes.Length-1]&0xf0)>>4;
if((b1==13)|(b1==11))buffer.Append(“-”);
对于(int i=0;i
int是正确的方法吗?当然是BCD的uint?没错,我会做这个更改,不管怎样,我检查它没有任何带符号的int。你能扩展你试图解决的问题吗?我在读取文件时看到了转换,但我总是将它们作为字节数组处理。我从未见过它们被处理为int或unsigned int。你能给我一个样本代码@Mikebe aware of asciencoding吗,因为它无法正确解码所有编码字符,并用“?”代替它们。所以只需使用字符转换。