سؤال

انا استخدم تنفيذ Jon Skeet EBCDIC في .NET لقراءة ملف VSAM تم تنزيله في الوضع الثنائي مع FTP من نظام الحاسب الرئيسي. إنه يعمل بشكل جيد للغاية للقراءة/الكتابة في هذا الترميز ، ولكن ليس لديه أي شيء لقراءة القيم غير المعبأة. يحتوي ملفي على هذه ، وأنا بحاجة إلى تفريغها (على حساب المزيد من البايتات ، من الواضح).

كيف يمكنني أن أفعل هذا؟

يتم تعريف حقولاتي على أنها PIC S9(7)V99 COMP-3.

هل كانت مفيدة؟

المحلول

آه ، BCD. Honk إذا كنت تستخدمه في 6502 التجميع.

بالطبع ، أفضل رهان هو السماح لـ COBOL MOVE بالقيام بالمهمة لك! أحد هذه الاحتمالات قد يساعد.

(احتمال #1) على افتراض أن لديك إمكانية الوصول إلى الحاسوب الرئيسي والرمز المصدر ، وملف الإخراج هو فقط لاستخدامك ، قم بتعديل البرنامج بحيث ينقل القيمة فقط إلى PIC S9 (7) V99.

(احتمال #2) على افتراض أنه ليس بهذه السهولة ، (على سبيل المثال ، يتم إدخال الملف لـ PGMs الأخرى ، أو لا يمكن تغيير الكود) ، يمكنك كتابة برنامج COBOL آخر على النظام الذي يقرأ هذا الملف ويكتب آخر. قم بقطع ولصق تخطيط سجل الملف مع BCD في البرنامج الجديد لملفات الإدخال والإخراج. تعديل إصدار الإخراج ليكون غير معبأ. اقرأ سجلًا ، وقم بإجراء "تحرك مطابق" لنقل البيانات ، والكتابة ، حتى EOF. ثم نقل الذي - التي ملف.

(الاحتمال رقم 3) إذا لم تتمكن من لمس الحاسب الرئيسي ، لاحظ الوصف في المقالة التي ربطتها في تعليقك. BCD بسيط نسبيا. هو - هي يستطع كن سهلاً مثل هذا (vb.net):

Private Function FromBCD(ByVal BCD As String, ByVal intsz As Integer, ByVal decsz As Integer) As Decimal
    Dim PicLen As Integer = intsz + decsz
    Dim result As Decimal = 0
    Dim val As Integer = Asc(Mid(BCD, 1, 1))
    Do While PicLen > 0
        result *= 10D
        result += val \ 16
        PicLen -= 1
        If PicLen > 0 Then
            result *= 10D
            result += val Mod 16
            PicLen -= 1
            BCD = Mid(BCD, 2)
        End If
        val = Asc(Mid(BCD, 1, 1))
    Loop
    If val Mod 16 = &HD& Then
        result = -result
    End If
    Return result / CDec(10 ^ decsz)
End Function

لقد اختبرته مع بعض الاختلافات في هذه المكالمة:

MsgBox(FromBCD("@" & Chr(13 + 16), 2, 1))

على سبيل المثال ، IS -40.1. ولكن فقط عدد قليل. لذلك قد لا يزال خطأ.

إذن ، إذا بدأ Comp-3 ، على سبيل المثال ، في Byte 10 من تخطيط سجل الإدخال ، فإن هذا سيحلها:

dim valu as Decimal = FromBCD(Mid(InputLine,10,5), 7,2))

مع الإشارة إلى الصيغ من مقالة تحويل البيانات لـ # Bytes لإرسالها ، و # من 9 قبل وبعد V.

تخزين النتيجة في عشرية لتجنب تقريب الأخطاء. esp إذا كان $$$. سوف تعويم ومزدوج يسبب لك الحزن! إذا لم تكن تقوم بمعالجتها ، فهو حتى السلسلة أفضل.

بالطبع يستطع كن أكثر صعوبة. حيث أعمل ، يكون الحاسب الرئيسي 9 بت لكل بايت. جدي. هذا ما يجعل أول 2 احتمالات بارزة للغاية. بالطبع ما يجعلهم أفضل حقًا هو حقيقة أنك قد تكون مبرمجًا للكمبيوتر الشخصي فقط ، وهذا عذر رائع للحصول على مبرمج رئيسي للقيام بالعمل من أجلك! إذا كنت محظوظًا جدًا لوجود هذا الخيار ...

السلام ، -

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top