如何将解压缩的十进制转换回COMP-3?

我问了一个关于转换COMP字段的问题,我没有得到任何答案。 我希望堆栈溢出可以帮助我解决这个问题。 我成功地将COMP-3转换为十进制。我需要你帮助将解压缩的十进制数转换回COMP-3,使用任何高级编程语言,但最好是Java或c#.net。     
已邀请:
在压缩十进制中,-123表示为X'123d'(最后一个nyble c,d或f是符号)。 处理压缩十进制的最简单方法之一是简单地转换字节 到十六进制字符串(或根据需要反之亦然)然后使用正常的字符串操作。这可能不是最有效的,但它很容易实现。 所以将Integer(值)转换为压缩十进制是粗略的(注意:我没有测试过代码)
String sign = "c";
if (value < 0) {
    sign = "d";
    value = -1 * value;
}
String val = value + "d"

byte[] comp3Bytes = new BigInteger(val, 16).toByteArray();
以下是转换为/从comp3转换的一些示例代码 要从字节数组中检索压缩十进制,请参阅方法getMainframePackedDecimal 在http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Common/Conversion.java?revision=3&view=markup 并设置压缩小数点 setField在http://record-editor.svn.sourceforge.net/viewvc/record-editor/Source/JRecord/src/net/sf/JRecord/Types/TypePackedDecimal.java?revision=3&view=markup 两个例程都采用一个字节数组,一个起始位置和一个字段位置的长度。 还有其他一些在网上这样做的例子(JRanch我认为还有代码进行转换),做一些谷歌搜索。     
将分区十进制转换为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);
    
当我过去使用Java搞乱COMP-3时,我最终编写了一个读取字节的方法并将它们转换为数字。我不认为我曾经写过COMP-3,但我想我会反过来使用相同的逻辑。     

要回复问题请先登录注册