thR*_*ity 1 cobol bit-manipulation
我有使用名为"Sign Embedded"的数据类型以格式存储的数据
签署嵌入式
此数据类似于数字字符数据,但是,符号将嵌入字段的最右侧字节中.
这就是说,HELP但我不知道如何将其转换为普通的数字字符数据
我在这里有一些这些数据的例子
2698388x = -26983888
1665289w = -16652897
19200p = -192000
72119v = -721196
Run Code Online (Sandbox Code Playgroud)
这是按位操作......我猜,但我不知道确切的算法.
如果有人可以帮我解决这个问题,我将不胜感激:)
ps.this数据是由COBOL程序生成的(虽然....无关紧要)
这是一些Ascii Cobol编译器(Fujitsu,GNU-Cobol等)使用的Zoned十进制格式.
在最近的回答中,我为大型机和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
Run Code Online (Sandbox Code Playgroud)
最后一个或低nyble(4位)总是给出十进制值,第一个或高nyble给出符号.
我不确定负数是用大写或小写字母表示的,需要测试.
有些编译器可能没有使用正值.
此外,在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@  
Run Code Online (Sandbox Code Playgroud)
所以你必须有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 = '';
}
Run Code Online (Sandbox Code Playgroud)
或者
digit = digit & x'0f';
Run Code Online (Sandbox Code Playgroud)
始终将字符转换为0到10范围内的数字,用于ebcdic或ascii数字/ zoned-decimal