C# 如何将未打包的十进制数转换回COMP-3?

C# 如何将未打包的十进制数转换回COMP-3?,c#,java,cobol,packed-decimal,C#,Java,Cobol,Packed Decimal,我问了一个关于转换COMP字段的问题,但没有得到任何答案 我希望堆栈溢出可以在这个问题上帮助我 我成功地把COMP-3转换成十进制。我需要您的帮助,以任何高级编程语言,但最好是Java或c#.net,将未打包的十进制数转换回COMP-3 当我过去用Java处理COMP-3时,我最终编写了一个方法来读取字节并将其转换为数字。我不认为我必须写出COMP-3,但我假设我会使用同样的逻辑进行相反的操作。将分区十进制转换为COMP-3相当容易——翻转低字节的半字节,去掉所有其他字节的高半字节 考虑数字12

我问了一个关于转换COMP字段的问题,但没有得到任何答案

我希望堆栈溢出可以在这个问题上帮助我


我成功地把COMP-3转换成十进制。我需要您的帮助,以任何高级编程语言,但最好是Java或c#.net,将未打包的十进制数转换回COMP-3

当我过去用Java处理COMP-3时,我最终编写了一个方法来读取字节并将其转换为数字。我不认为我必须写出COMP-3,但我假设我会使用同样的逻辑进行相反的操作。

将分区十进制转换为COMP-3相当容易——翻转低字节的半字节,去掉所有其他字节的高半字节

考虑数字12345——在压缩十进制表示法中,这将是一个x'12345C'或x'12345F'(C和F都是+,a B和D都是-)。当您将其转换为分区十进制时,您翻转了低半字节,并在每个数字之间的高半字节中插入了一个“F”。把它变成x'F1F2F3F4C5'

若要将其转换回,只需颠倒过程。使用java,这看起来像:

byte[] myDecimal = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 };
byte[] myPacked = new byte[3];

//Even low nibble moved to high nibble and merged with odd low nibble
myPacked[0] = ((myDecimal[0] & 0b00001111)  << 4)) | (myDecimal[1] & 0b00001111);
myPacked[1] = ((myDecimal[2] & 0b00001111)  << 4)) | (myDecimal[3] & 0b00001111);

//Last byte gets filpped for sign
myPacked[2] = ((myDecimal[5] & 0b00001111)  << 4)) | (myDecimal[4] & 0b00001111);
byte[]myDecimal={0xF1,0xF2,0xF3,0xF4,0xF5};
字节[]myPacked=新字节[3];
//偶数低半字节移动到高半字节,并与奇数低半字节合并

myPacked[0]=((myDecimal[0]&0b00001111)在压缩十进制中-123表示为X'123d'(最后一个nyble c、d或f为符号)。 处理压缩十进制的最简单方法之一就是简单地转换字节 然后使用普通的字符串操作。这可能不是最有效的,但很容易实现

因此,将整数(值)转换为压缩十进制大约是(注意:我还没有测试代码)

String sign=“c”;
如果(值<0){
sign=“d”;
值=-1*值;
}
字符串val=值+d
byte[]comp3Bytes=新的BigInteger(val,16).toByteArray();
下面是一些转换为comp3或从comp3转换为comp3的示例代码 要从字节数组中检索压缩十进制数,请参阅方法getMainframePackedDecimal 在

要设置压缩小数,请参见 设定场

这两个例程都采用字节数组、起始位置和字段位置的长度


在web上还有其他这样做的例子(我认为JRanch也有进行转换的代码),做一点谷歌搜索。

@Krishna:我现在手头没有代码,可能在不再需要的时候就把它扔掉了。我想我只是读了comp-3的定义,然后决定了如何排列字节。comp-3是十六进制表示法,符号位在表示法的末尾。它表示两位数字一个单字节。正数在结尾处由0x0C或0x0F标识。负数在表示的结尾处由0x0D标识。COMP-3是十进制表示,符号半字节在结尾。否则正确。嗯……如果您能够成功地将COMP-3转换为十进制,那么是什么阻止了您将十进制转换为CO的过程呢MP-3转换?为什么这么困难?取无符号数字的低4位,将它们与移位和逐位运算结合在一起,并在末尾加上适当的符号指示符。尝试一下,如果你有问题,回到这里询问。或者用ASCII或EBCDIC写出来,用COBOL写翻译程序。@David,can您对编写COBOL翻译程序的部分做了更多的说明??因为我的代码将在.NET中,如果可能的话,您能给我一些将输出转换为EBCDIC格式的详细信息吗?我真的不知道您想做什么。为什么您需要它回到COMP-3中?如果它要与COBOL程序接口,COBOL可以读取文本以及COMP-3-3,COBOL程序可以进行任何必要的转换。EBCDIC是一种8位字符代码,几乎直接的ASCII到EBCDIC的转换应该很容易(我不知道EBCDIC有更模糊的ASCII字符)。如果没有其他内容,请准备ASCII输出,然后进行逐字节转换。
String sign = "c";
if (value < 0) {
    sign = "d";
    value = -1 * value;
}
String val = value + "d"

byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();