微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Cobol对Java中的BigDecimal的Cobol响应中解码Signed Display字段

如何解决如何在Cobol对Java中的BigDecimal的Cobol响应中解码Signed Display字段

我正在使用copyBook4Java库,在该库中,我可以找到解码选项,这些选项不能完全解决带有大型签名显示字段为BigDecimal类型变量的情况。在下面可以看到我的测试:

assertEquals(new BigDecimal("0.00"),typeConverter.to("00000000000000ä".getBytes(StandardCharsets.ISO_8859_1),15,2,true));
assertEquals(new BigDecimal("-200541.00"),typeConverter.to("00000002005410ä".getBytes(StandardCharsets.ISO_8859_1),true));
assertEquals(new BigDecimal("33258.91"),typeConverter.to("00000000332589A".getBytes(StandardCharsets.ISO_8859_1),true));

copyBookFieldSigningType.LAST_BYTE_EBCDIC_BIT5使我可以处理响应,但不幸的是,解码后的值是错误的,尤其是对于以下情况:

  • 十进制字段0.01-0.09
  • 零值0.00
  • 负值,即-200541.00

我想我需要修改

(signingType == copyBookFieldSigningType.LAST_BYTE_EBCDIC_BIT5) {
            byte res = (byte)(bytes[bytes.length -1] & 240); // Read last byte and zero first 4 bits of the result,11110000
            byte[] bytescopy = Arrays.copyOf(bytes,bytes.length - 1);
            if((byte)(res ^ 208) == 0 ||(byte)(res ^ 176) == 0) { // 208 = 11010000,176 = 10110000
                strValue = "-" + getString(bytescopy,offset,length -1,removePadding,1) + String.valueOf(bytes[bytes.length -1] & 15);
            } else {
                strValue = getString(bytescopy,bytescopy.length,1) + String.valueOf(bytes[bytes.length -1] & 15);
            }

        }

我不知道如何针对我的情况正确修改算法。有人可以建议我如何将大型机的响应正确解码为BigDecimal格式吗?

您可以在这里使用单元测试检查我的存储库:https://repl.it/@epredator/copybook4java#copybook4java/src/test/java/com/nordea/oss/copybook/converters/SignedDecimalToBigDecimalLastByteTest.java

在下面您可以看到响应抄本的示例:

           09 exchangerate               PIC S9(6)V9(7).
           09 accountBalance             PIC S9(13)V9(2).

样本大型机响应:

20200931        1234567C  Adam1 NO ZOO TESTACCOUNT O,SAMPLE SITE1L
 0212013000105101YYY SAMPLECO                                            Currentacc                       EUR000000000000000000000332589A00000000000000ä00000002005410ä00000000332589A00000000000000ä00000000000000ä91193000105037XXX SAMPLECO                                            Checkingac                       EUR000000000000000000002786655I00000000000000ä00000000000000ä00000000000000ä00000000000000ä00000000000000ä

解决方法

很遗憾,我的声誉不足以发表评论!

我不确定问题中是否有足够的细节来回答这个问题。 它怀疑您收到的字符流需要转换。

我建议您参考ASCII and EBCDIC Translation Tables来看看您是否有启发。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。