2010-03-01 7 views
7

में ईबीसीडीआईसी पैक किए गए दशमलव (COMP-3) को अनपॅक करना मैं Jon Skeet's EBCDIC implementation in .NET का उपयोग कर रहा हूं ताकि एक मेनफ्रेम सिस्टम से एफ़टीपी के साथ बाइनरी मोड में डाउनलोड की गई वीएसएएम फ़ाइल को पढ़ने के लिए। यह इस एन्कोडिंग में पढ़ने/लिखने के लिए बहुत अच्छी तरह से काम करता है, लेकिन इसमें पैक-दशमलव मान पढ़ने के लिए कुछ भी नहीं है। मेरी फ़ाइल में ये शामिल हैं, और मुझे उन्हें अनपैक करने की आवश्यकता है (जाहिर है, अधिक बाइट्स की कीमत पर)।एक एएससीआईआई रूपांतरण

मैं यह कैसे कर सकता हूं?

मेरे क्षेत्रों PIC S9(7)V99 COMP-3.

+0

पैक-दशमलव है EBCDIC प्रारूप का हिस्सा है, या यह सिर्फ एक फ़ाइल जो दोनों का उपयोग करने के लिए होता है? मैं उस प्रारूप से परिचित नहीं हूं, मुझे डर है :( –

+0

यह एक फ़ाइल है जो दोनों का उपयोग करती है। यह बाइट्स को बचाने के लिए संख्याओं को निचोड़ने का पुराना स्कूल तरीका है। A-99999।99 4 बाइट्स में संग्रहीत किया जा सकता है। –

+0

http://www.3480-3590-data-conversion.com/article-packed-fields.html –

उत्तर

3

आह, बीसीडी के रूप में परिभाषित कर रहे हैं। अगर आपने इसे 6502 असेंबली में इस्तेमाल किया तो सम्मान करें।

बेशक, सबसे अच्छा शर्त है कि कोबोल मूव आपके लिए नौकरी करे! इन संभावनाओं में से एक मदद कर सकता है।

(संभावना # 1) मान लीजिए कि आपके पास मेनफ्रेम और स्रोत कोड तक पहुंच है, और आउटपुट फ़ाइल केवल आपके उपयोग के लिए है, प्रोग्राम को संशोधित करें, इसलिए यह केवल एक सादे अनपॅक किए गए पीआईसी एस 9 (7) के मान को चलाता है V99।

(संभावना # 2) मान लीजिए कि यह इतना आसान नहीं है, (उदाहरण के लिए, फ़ाइल अन्य पीजीएमएस के लिए इनपुट है, या कोड नहीं बदल सकता है), आप सिस्टम पर एक और COBOL प्रोग्राम लिख सकते हैं जो उस फ़ाइल को पढ़ता है और दूसरा लिखता है । इनपुट और आउटपुट फ़ाइलों के लिए नए प्रोग्राम में बीसीडी के साथ फ़ाइल रिकॉर्ड लेआउट को काटें और पेस्ट करें। आउटपुट संस्करण को गैर-पैक करने के लिए संशोधित करें। एक रिकॉर्ड पढ़ें, डेटा को स्थानांतरित करने के लिए 'आगे बढ़ें' करें, और ईओफ़ तक लिखें। फिर को फ़ाइल स्थानांतरित करें।

(संभावना # 3) यदि आप मेनफ्रेम को स्पर्श नहीं कर सकते हैं, तो आपने अपनी टिप्पणी में लिंक किए गए लेख में विवरण नोट करें। बीसीडी अपेक्षाकृत सरल है। यह इस तरह ही आसान (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)) 

जैसे, -40.1 है। लेकिन कुछ ही। तो यह अभी भी गलत हो सकता है।

तो फिर अगर आपके कंप्यूटर अनुप्रयोग -3 शुरू होता है, कहते हैं, इनपुट रिकॉर्ड लेआउट की बाइट 10 पर, इस इसे हल होगा: बाइट्स की # के लिए डेटा-रूपांतरण लेख से फार्मूले को नोट करते हुए

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

भेजने के लिए, और 9 के पहले और बाद में वी।

गोलाकार त्रुटियों से बचने के लिए परिणाम को दशमलव में स्टोर करें। एएसपी अगर यह $$$ है। फ्लोट & डबल आपको दुःख का कारण बन जाएगा! यदि आप इसे संसाधित नहीं कर रहे हैं, तो एक स्ट्रिंग भी बेहतर है।

बेशक यह कठिन हो सकता है। जहां मैं काम करता हूं, मेनफ्रेम प्रति बाइट 9 बिट्स है। गंभीर। यही कारण है कि पहली 2 संभावनाएं इतनी महत्वपूर्ण बनाती हैं। बेशक वास्तव में उन्हें बेहतर बनाता है यह तथ्य है कि आप एक पीसी केवल प्रोग्रामर हो सकते हैं और मेनफ्रेम प्रोग्रामर को आपके लिए काम करने के लिए यह एक बहुत अच्छा बहाना है! यदि आप इतना है कि विकल्प होता है करने के लिए भाग्यशाली रहे हैं ...

शांति, -al

+1

धन्यवाद अल! COBOL प्रोग्राम को बदलना संभव हो सकता है या किसी अन्य को अनपैक करने के लिए लिखा जा सकता है, लेकिन लक्ष्य इसे .NET में पूरा करना है ताकि हम सीधे VSAM -> FTP कार्य चला सकें। मुझे कैसे पता चलेगा कि वी (दशमलव) द्विआधारी प्रतिनिधित्व पर आधारित है? क्या यह भी संभव है? मेनफ्रेम कैसे जानता है? धन्यवाद, मैं आपकी मदद की सराहना करता हूं। –

+0

जोश, आप नहीं जानते कि वी केवल डेटा से कहां है; आपको पीआईसी चाहिए। मेनफ्रेम पीआईसी से इसका ट्रैक रखता है। पंचकार्ड दिनों से विशिष्ट दुबला, बिट-सेविंग समाधान। लेकिन अगर आप इसके बारे में सोचते हैं, तो ऐसा कोई मामला नहीं है जहां सिस्टम की जानकारी की आवश्यकता न हो। बिल्ली, अगर आप खुद को रिकॉर्ड लेआउट नहीं देख पा रहे हैं, तो आपको इसे वैसे भी हैक करना होगा! – FastAl

+0

हाँ, आप सही हैं, मुझे नहीं लगता था कि एक रास्ता होगा। मेरे पास सभी ऑफसेट निर्धारित हैं और रिकॉर्ड लेआउट यहां है, अगर मैं दशमलव स्थिति को प्रोग्रामेटिक रूप से समझने का कोई तरीका था तो मैं उत्सुक था। ठीक है, मैं कल इस समारोह को एक भंवर दे दूंगा और आपको बताऊंगा कि यह कैसे काम करता है! आपकी मदद के लिए फिर से धन्यवाद, मेरी इच्छा है कि मैं दो बार ऊपर उठ सकता हूं। –