首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将VB的Double转换为COBOL的COMP-3?

如何将VB的Double转换为COBOL的COMP-3?
EN

Stack Overflow用户
提问于 2009-02-11 03:21:19
回答 1查看 2.9K关注 0票数 1

这里有人知道如何将VB双机转换成Cobol S9(15)V99 Comp-3数据类型吗?

EN

回答 1

Stack Overflow用户

发布于 2009-02-11 03:27:12

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

那就是短信了。换句话说,最简单的解决方案可能是以文本"3.14159“的形式将数字写入文件,并让COBOL代码以该格式读取它,并将其MOVECOMP-3字段?

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

S9(15)V99需要18个nybbles (一个nybbles为4位,或半个八进制)来存储:

  • 整数位(15 Nybbles),
  • 小数位(2 Nybbles),
  • 符号(1 Nybbles),

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

因此,数字3.14将表示为字节:

代码语言:javascript
复制
00 00 00 00 00 00 00 31 4C

唯一棘手的地方是最后一个符号nybble (C表示正,D表示否定)。

下面是我在Excel (遗憾的是这台机器上没有安装VB )中出现的一些代码,它向您展示了如何做到这一点。makeComp3()函数应该很容易地被转换成一个真正的VB程序。

宏测试程序输出的值分别为04976,分别为十六进制00314C (00314C+3.14)。

第一步(在所有声明之后)是通过将双小数点乘以相关的10的幂,然后将其转化为整数,从而使其成为一个隐含的十进制:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
    ' 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

然后,我们一次处理两位数的字符串,然后将每对数字组合成一个输出存贮器。最后一步是与符号一起处理最后一个数字:

代码语言:javascript
复制
    ' 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

这只是一个测试工具,尽管它可能需要更多的测试用例:)

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/535303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档