加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#中将Cobol COMP字段输出转换为可读小数?

发布时间:2020-12-15 23:39:31 所属栏目:百科 来源:网络整理
导读:在将cobol程序转换为C#时,我遇到了COMP: 03 Var1 PIC X(4).03 Var2 PIC X(3).03 Var3 PIC X(3).03 Var4 PIC X(4).03 Var5 PIC X(16).03 Var6 PIC X(4).03 Var7 PIC X(2).03 Var8 PIC X.03 Var9 PIC X(4).03 Var10 PIC X(16).03 Var11 PIC S9(7)V9(2) COMP.0
在将cobol程序转换为C#时,我遇到了COMP:

03  Var1                     PIC X(4).
03  Var2                     PIC X(3).
03  Var3                     PIC X(3).
03  Var4                     PIC X(4).
03  Var5                     PIC X(16).
03  Var6                     PIC X(4).
03  Var7                     PIC X(2).
03  Var8                     PIC X.
03  Var9                     PIC X(4).
03  Var10                    PIC X(16).
03  Var11                    PIC S9(7)V9(2) COMP.
03  Var12                    PIC S9(7)V9(2) COMP.
03  Var13                    PIC S9(7)V9(2) COMP.
03  Var14                    PIC S9(7)V9(2) COMP.
03  Var15                    PIC S9(7)V9(2) COMP.
03  Var16                    PIC S9(7)V9(2) COMP.
03  Var17                    PIC S9(7)V9(2) COMP.
03  Var18                    PIC S9(7)V9(2) COMP.
03  Var19                    PIC S9(7)V9(2) COMP.
03  Var20                    PIC S9(7)V9(2) COMP.
03  Var21                    PIC S9(7)V9(2) COMP.
03  Var22                    PIC S9(7)V9(2) COMP.
03  Var23                    PIC S9(7)V9(2) COMP.
03  Var24                    PIC S9(7)V9(2) COMP.

我花了几个小时研究COMP.大多数搜索都会产生关于COMP-3的内容,或者提到COMP是二进制转换.但是,cobol程序的COMP输出是非COMP字段,后跟(括号之间):

( F ” ” )

虽然实际值都是0.00,但var13是64.70

注意:这些是从记事本复制的值.另外,请注意我对cobol知之甚少.

如何从COMP转换为十进制?理想情况下,我也可以将十进制转换为COMP,因为我需要将事物放回到相同的格式中.

我试过用二进制文件读取数据:

public static void ReadBinaryFile(string directoryString)
    {
        using (BinaryReader reader = new BinaryReader(File.Open(directoryString,FileMode.Open)))
        {
            string myString = Encoding.ASCII.GetString(reader.ReadBytes(113));
            Console.WriteLine(myString);
        }
    }

编辑:在正确的轨道上

感谢@ piet.t和@jdweng的帮助.

虽然这个测试代码仍然存在问题,但这应该可以帮助我处理其解决方案的任何人:

public static void ReadBinaryFile(string directoryString)
    {
        using (BinaryReader reader = new BinaryReader(File.Open(directoryString,FileMode.Open)))
        {
            string asciiPortion = Encoding.ASCII.GetString(reader.ReadBytes(57)); // Read the non-comp values

            Console.Write(asciiPortion); // Test the ascii portion 

            Console.WriteLine("var11: " + reader.ReadInt32());
            Console.WriteLine("var12: " + reader.ReadInt32());
            Console.WriteLine("var13: " + reader.ReadInt32());
            Console.WriteLine("var14: " + reader.ReadInt32());
            Console.WriteLine("var15: " + reader.ReadInt32());
            Console.WriteLine("var16: " + reader.ReadInt32());
            Console.WriteLine("var17: " + reader.ReadInt32());
            Console.WriteLine("var18: " + reader.ReadInt32());
            Console.WriteLine("var19: " + reader.ReadInt32());
            Console.WriteLine("var20: " + reader.ReadInt32());
            Console.WriteLine("var21: " + reader.ReadInt32());
            Console.WriteLine("var22: " + reader.ReadInt32());
            Console.WriteLine("var23: " + reader.ReadInt32());
            Console.WriteLine("var24: " + reader.ReadInt32());
        }
    }

编辑2:试图找到问题

问题:每个值后面都会出现一些垃圾值,打印为下一个int32.

实际值:

var11 = var12 = 0.00
var13 = 58.90
var14 = 0.00
var15 = -0.14
var16 = 0.00
var17 = var18 = var19 = var20 = 0.00
var21 = var22 = var23 = var24 = 0.00

输出(带填充):

Var11:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var12:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var13:  5890  HEX: 00001702  BIN: 00000000000000000001011100000010
Var14:   368  HEX: 00000170  BIN: 00000000000000000000000101110000
Var15:   -14  HEX: FFFFFFF2  BIN: 22222222222222222222222221110010
Var16:    -1  HEX: FFFFFFFF  BIN: 22222222222222222222222222222211
Var17:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var18:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var19:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var20:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var21:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var22:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var23:     0  HEX: 00000000  BIN: 00000000000000000000000000000000
Var24:     0  HEX: 00000000  BIN: 00000000000000000000000000000000

记事本(复制)表示:

p  ò???????

记事本(Visual)表示:

[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][STX][ETB][NUL][NUL]p[SOH]
[NUL][NUL]ò???????[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL]
[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL]
[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][LF]

编辑3:解决方案!

@ piet.t没事.感谢您对我的第一个问题的有用答案!这个问题是cobol计划特有的.我被引导相信Var14总是0,但是:

Var14 = SomeCalculationIHadNoIdeaAbout(Var13,SomeOtherNumber);

我使用RecordEdit来更轻松地调整数据(警告:程序在某些地方有点奇怪),并注意到“垃圾”值的奇怪趋势.

我的问题的真正解决方案是我在几天前做的第一个EDIT中的代码:/.

注意:我还必须使用换行符,我没有在该代码中添加.要做到这一点,只需添加另一个reader.ReadBytes(1);.

注2:您可能需要查看EBDCDIC和/或Endianness,这可能会使您的解决方案比我的解决方案更困难.

解决方法

事情会变得有点复杂,因为COBOL程序正在使用我认为C#不知道的定点变量.

对于转换,将每个PIC S9(7)V9(2)COMP字段视为Int32(它应该是BigEndian格式).但请注意,由于COBOL字段声明中隐含的小数点,您将无法获得实际值,但值* 100.

请注意,使用定点数据将允许精确计算带小数的值,同时将其转换为C#中的浮点可能会导致舍入,因为二进制浮点不能始终精确地表示小数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读