تفريغ العشرية المعبأة eBCDIC (COMP-3) في تحويل ASCII
سؤال
انا استخدم تنفيذ 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 احتمالات بارزة للغاية. بالطبع ما يجعلهم أفضل حقًا هو حقيقة أنك قد تكون مبرمجًا للكمبيوتر الشخصي فقط ، وهذا عذر رائع للحصول على مبرمج رئيسي للقيام بالعمل من أجلك! إذا كنت محظوظًا جدًا لوجود هذا الخيار ...
السلام ، -