如何将VB的Double转换为COBOL的COMP

您所在的位置:网站首页 vb数据转换 如何将VB的Double转换为COBOL的COMP

如何将VB的Double转换为COBOL的COMP

2023-03-29 12:48| 来源: 网络整理| 查看: 265

如果不需要在同一个程序中完成,在我看来,找到COBOL可以理解的VB 和的通用格式会更容易。

这将是文字。换句话说,最简单的解决方案可能是将文件的编号写为文本“3.14159”,并让COBOL代码以该格式读取它,然后MOVE将其输入到COMP-3字段中?

如果这是不可能的,COMP-3是一个相当简单的BCD类型。无论如何,我会将该数字转换为字符串,然后每次将两个字符转换为字节数组。

的S9(15)V99要求18半字节(一个半字节是4位,或半八位字节),用于存储:

整数位(15半字节)。 小数位(两个nybbles)。 符号(一个nybble)。

小数点不需要空格,因为V是隐含的小数,而不是真实的小数。

所以数量3.14将被表示为字节:

00 00 00 00 00 00 00 31 4C

唯一棘手的一点是,最终符号半字节(C用于正和D为负)。

这是我在Excel VBA中掀起的一小段代码(我没有在这台机器上安装VB),它告诉你如何去做。 makeComp3()函数应该很容易转换成真正的VB程序。

宏测试程序输出它们分别十六进制00,31和4C值0,4976和(00314C是+3.14)。

第一步(所有声明之后)是由十个相关力量放大它,然后把它变成一个整数,使双一个隐含的小数点:

Option Explicit ' makeComp3. ' ' inp is the double to convert. ' ' sz is the minimum final size (with sign). ' ' frac is the number of fractional places. ' Function makeComp3(inp As Double, sz As Integer, frac As Integer) As String Dim inpshifted As Double Dim outstr As String Dim outbcd As String Dim i As Integer Dim outval As Integer Dim zero As Integer zero = Asc("0") ' Make implied decimal. ' inpshifted = Abs(inp) While frac > 0 inpshifted = inpshifted * 10 frac = frac - 1 Wend inpshifted = Int(inpshifted)

接下来,我们让它变成正确大小的字符串,以使处理更容易:

' Get as string and expand to correct size. ' outstr = CStr(inpshifted) While Len(outstr) < sz - 1 outstr = "0" & outstr Wend If Len(outstr) Mod 2 = 0 Then outstr = "0" & outstr End If

然后,我们处理该串在一个时间两位数字,每对被组合成一个输出半字节。最后一步是用符号一起处理最后一个数字:

' Process each nybble pair bar the last. ' outbcd = "" For i = 1 To Len(outstr) - 2 Step 2 outval = (Asc(Mid(outstr, i)) - zero) * 16 outval = outval + Asc(Mid(outstr, i + 1)) - zero outbcd = outbcd & Chr(outval) Next i ' Process final nybble including the sign. ' outval = (Asc(Right(outstr, 1)) - zero) * 16 + 12 If inp < 0 Then outval = outval + 1 End If makeComp3 = outbcd & Chr(outval) End Function

而这仅仅是测试工具,虽然它也许可以多带几个测试案例做:-)

Sub Macro1() Dim i As Integer Dim cobol As String cobol = makeComp3(3.14159, 6, 2) For i = 1 To Len(cobol) MsgBox CStr(Asc(Mid(cobol, i))) Next i End Sub


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3