C# 将BCD转换代码从Java迁移到.Net
我正在转换一个将BCD数据转换为ASCII的Java类 我正在将其转换为.Net BCD转换器 以下是从java转换而来的,但它给出了错误的转换值,例如,对于123456789,它给出了12345613153C# 将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 &
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吗,因为它无法正确解码所有编码字符,并用“?”代替它们。所以只需使用字符转换。