我有使用称为“ Sign Embedded”的数据类型以该格式存储的数据
嵌入式标牌
此数据类似于数字字符数据,但是,符号将嵌入在该字段的最右边字节中。
就是HELP
这样,但是我不知道如何将其转换为普通的数字字符数据
我这里有一些这些数据的例子
2698388x = -26983888
1665289w = -16652897
19200p = -192000
72119v = -721196
这是按位操作...我想,但是我不知道确切的算法。
如果有人可以帮助我解决这个问题,我将不胜感激:)
ps。此数据是由COBOL程序生成的(尽管....没关系)
这是某些Ascii Cobol编译器(Fujitsu,GNU-Cobol等)使用的分区十进制格式。
在最近的答案中,我为大型机和PC cobol编译器提供了Java代码。
基本上最后一位是符号
character values Hex
positive @A => I +0 => +9 40 => 49
negative PQ => Y -0 => -9 50 => 59 or is it 70 => 79 (lower case)
unsigned 01 => 9 0 => 9 30 => 39
最后或最低四位(4位)始终给出十进制值,第一或最高四位给出正负号。
我不确定负数是否用大写或小写字母表示,是否需要测试。
一些编译器可能未使用正值。
此外,在Cobol的区位十进制的小数点是不是存储,假定
if the Cobol Copybook is
03 fld pic s99999.
121 is stored as 0012A
if the Cobol Copybook is (no sign)
03 fld pic 99999.
121 is stored as 00121
but if the copybook is (v stands for assumed decimal point)
03 fld pic s999v99.
then 123 is stored as 1230@
所以你必须有COBOL字帖; 最好在Cobol中解码或使用商业软件包。
大多数开源Cobol接口软件包都集中在大型机EBCDIC Cobol上。如果java是一个选项
注意:我是JRecord的作者。
要解码该号码,代码可能是
lastDigit = uppercase(lastDigit);
switch (lastDigit) {
case 'A' -> 'I': sign = ''; lastDigit = lastDigit - 'A' + '0'; break;
case 'P' -> 'Y': sign = '-'; lastDigit = lastDigit - 'P' + '0'; break;
case '0' -> '9': sign = '';
}
或者
digit = digit & x'0f';
对于ebcdic或ascii数字/带小数的十进制,始终将字符转换为0到10范围内的数字
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句