2009-02-11 78 views

回答

5

如果不需要在同一個程序中完成,在我看來,找到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程序。

宏測試程序輸出它們分別十六進制00314C04976和(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 
+0

嗨, 我想轉換是在VB中完成,但不知道如何。 Anywayz感謝您的答覆。那麼無論如何編碼在VB中的轉換?該程序的功能是讀取一個字符串輸入,然後將數字轉換爲cobol中的COMP-3並將其存儲到文本文件中。 – Grekoz 2009-02-11 03:38:36