如何使用嵌入的符号解码数字数据类型?

时间:2014-11-21 09:52:29

标签: bit-manipulation cobol

我有使用数据类型" Sign Embedded"

的格式存储的数据
  

签署嵌入式

     

此数据类似于数字字符数据,但是,符号会   嵌入在字段的最右边的字节中。

HELP说的是什么,但我不知道如何将其转换为普通数字字符数据

我在这里有一些这些数据的例子

2698388x = -26983888
1665289w = -16652897
19200p = -192000
72119v = -721196

这是按位操作......我猜,但我不知道确切的算法。

如果有人可以帮我解决这个问题,我将不胜感激:)

这个数据是由COBOL程序生成的(虽然......并不重要)

2 个答案:

答案 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可以处理格式(您需要指定一个PC Dialects Fujitsu或OpenCobol)。它还有一个示例程序Cobol2Csv,可以从Cobol转换为Csv。程序 Cobol2Csv 尚未生产就绪。

注意:我是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