我正在使用CopyBook4Java库,在那里我可以找到解码选项,这些选项不能完全解决大型机签名显示字段为BigDecimal
类型变量的情况。下面你可以看到我的测试:
assertEquals(new BigDecimal("0.00"), typeConverter.to("00000000000000ä".getBytes(StandardCharsets.ISO_8859_1), 0, 15, 2, true));
assertEquals(new BigDecimal("-200541.00"), typeConverter.to("00000002005410ä".getBytes(StandardCharsets.ISO_8859_1), 0, 15, 2, true));
assertEquals(new BigDecimal("33258.91"), typeConverter.to("00000000332589A".getBytes(StandardCharsets.ISO_8859_1), 0, 15, 2, 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, offset, bytesCopy.length, removePadding, 1) + String.valueOf(bytes[bytes.length -1] & 15);
}
}
我不知道如何正确地修改我的算法。有人能建议我如何正确地将主机的响应解码为BigDecimal
格式吗?
在这里,您可以使用单元测试检查我的存储库:https://repl.it/@reprator/copybook4java#copybook4java/src/test/java.com/nordea/oss/copybook/converts/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和EBCDIC翻译表,看看你是否有什么灵感。