gpt4 book ai didi

用于 cobol 显示和解压缩数字字段的 Java 映射

转载 作者:行者123 更新时间:2023-11-29 05:01:27 24 4
gpt4 key购买 nike

我对 9(显示格式)和 S9(解压缩数字)类型感到困惑。我正在使用 Java

从 DB2 存储过程中读取副本输出
* copy book
05 ABC PIC X(01).
05 XYZ PIC +9(09).

使用下面的 Java 代码,我能够正确读取这些值。数字的符号也很容易处理,因为它是 -+

// java code 
cobolResults.subString(1,1);
cobolResults.subString(2,9);

现在 copybook 被更改为提供解压缩的数字,如下所示:

05 ABC PIC X(01).
05 XYZ PIC S9(09).

我不确定在 Java 中用正确的符号读取数字的正确逻辑是什么?

最佳答案

首先是来自 IBM & Legstar 的软件包从 Cobol Copybooks 生成 Java 类。我自己的包裹JRecord is也可以使用,但它面向文件而不是在线处理。

基本上字段的最后一个字符包含符号 + 数字。我猜数据来自大型机;所以对于 US - Ebcdic (CP037/IBM237),最后一位将是

          0 1 2 3 4 5 6 7 8 9
positive { A B C D E F G H I
negative } J K L M N O P Q R

所以对于 +123,它将是 00000012C (C = +3),而 -123 将是 00000012L。

更糟糕的是,+0 和 -0 在不同的 EBCIDIC 方言和 ASCII 中也是不同的。因此,您要么需要确切知道正在使用哪个版本的 Ebcidic,要么需要在字节级别进行转换。

fromZoned 方法 JRecord Conversion进行转换:

    private static int positiveDiff = 'A' - '1';
private static int negativeDiff = 'J' - '1';

private static char positive0EbcdicZoned = '{';
private static char negative0EbcdicZoned = '}';

public static String fromZoned(String numZoned) {
String ret;
String sign = "";
char lastChar, ucLastChar;

if (numZoned == null || ((ret = numZoned.trim()).length() == 0) || ret.equals("-")) {
return "";
}

lastChar = ret.charAt(ret.length() - 1);
ucLastChar = Character.toUpperCase(lastChar);


switch (ucLastChar) {
case 'A': case 'B': case 'C':
case 'D': case 'E': case 'F':
case 'G': case 'H': case 'I':
lastChar = (char) (ucLastChar - positiveDiff);
break;
case 'J': case 'K': case 'L':
case 'M': case 'N': case 'O':
case 'P': case 'Q': case 'R':
sign = "-";
lastChar = (char) (ucLastChar - negativeDiff);
break;
default:
if (lastChar == positive0EbcdicZoned) {
lastChar = '0';
} else if (lastChar == negative0EbcdicZoned) {
lastChar = '0';
sign = "-";
}
}
ret = sign + ret.substring(0, ret.length() - 1) + lastChar;

return ret;
}

但是在字节级别上做起来更容易,它应该像下面这样(虽然代码没有经过测试):

    private static final byte HIGH_NYBLE = (byte) 0xf0;
private static final byte LOW_NYBLE = (byte) 0x0f;
private static final byte ZONED_POSITIVE_NYBLE_OR = (byte) 0xCF;
private static final byte ZONED_NEGATIVE_NYBLE_OR = (byte) 0xDF;
private static final byte ZONED_NEGATIVE_NYBLE_VALUE = (byte) 0xD0;

signByte = bytes[bytes.length - 1];

negative = false;
if (((byte) (signByte & HIGH_NYBLE)) == ZONED_NEGATIVE_NYBLE_VALUE) {
negative = true;
}

long result = 0;
for (int i = 0; i < bytes.length; i++) {
result = result * 10 + (bytes[i] & LOW_NYBLE);
}

if (negative) {
result = -1 * result;
}

关于用于 cobol 显示和解压缩数字字段的 Java 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31970680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com