我有使用数据类型" Sign Embedded"
的格式存储的数据签署嵌入式
此数据类似于数字字符数据,但是,符号会 嵌入在字段的最右边的字节中。
HELP
说的是什么,但我不知道如何将其转换为普通数字字符数据
我在这里有一些这些数据的例子
2698388x = -26983888
1665289w = -16652897
19200p = -192000
72119v = -721196
这是按位操作......我猜,但我不知道确切的算法。
如果有人可以帮我解决这个问题,我将不胜感激:)
这个数据是由COBOL程序生成的(虽然......并不重要)
答案 0 :(得分:5)
这是一些Ascii Cobol编译器(Fujitsu,GNU-Cobol等)使用的 Zoned 十进制格式。
在最近的answer中,我为大型机和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
最后一个或低nyble(4位)总是给出十进制值,第一个或高nyble给出符号。
我不确定负数是用大写或小写字母表示的,需要测试。
有些编译器可能没有使用正值。
同样在Cobol Zoned十进制中,小数点 未存储,假设为
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数字/ zoned-decimal,始终将字符转换为0到10之间的数字
答案 1 :(得分:1)
这不是我认识到的超量计划,但很清楚该模式是
value letter hex
-0 p 70
-1 q 71
-2 r 72
-3 s 73
-4 t 74
-5 u 75
-6 v 76
-7 w 77
-8 x 78
-9 y 79