2010-03-01 12 views
7

Sto utilizzando Jon Skeet's EBCDIC implementation in .NET per leggere un file VSAM scaricato in modalità binaria con FTP da un sistema mainframe. Funziona molto bene per la lettura/scrittura in questa codifica, ma non ha nulla da leggere valori decimali confezionati. Il mio file contiene questi, e ho bisogno di decomprimerli (al costo di più byte, ovviamente).Disimballaggio Decimali imballati EBCDIC (COMP-3) in una conversione ASCII

Come posso fare questo?

miei campi sono definiti come PIC S9(7)V99 COMP-3.

+0

è imballato decimale parte del formato EBCDIC, o è solo un file che succede ad usare entrambe le cose? Non ho dimestichezza con questo formato, temo :( –

+0

È un file che utilizza entrambi: è un modo vecchio di scuola per spremere i numeri per salvare i byte. A -99999.99 può essere memorizzato in 4 byte. –

+0

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

risposta

3

Ahh, BCD. Honk se lo hai usato nell'assemblaggio 6502.

Ovviamente, la soluzione migliore è lasciare che il COBOL MOVE faccia il lavoro per te! Una di queste possibilità può essere d'aiuto.

(Possibilità n. 1) Supponendo di avere accesso al mainframe e al codice sorgente e il file di output è SOLO per l'uso, modificare il programma in modo che SPOSTA il valore su un semplice SQ non decompresso (7) V99.

(Possibilità n. 2) Supponendo che non sia così facile, (ad esempio, il file viene immesso per altri pgms o non può cambiare il codice), è possibile scrivere un altro programma COBOL sul sistema che legge quel file e ne scrive un altro . Taglia e incolla il layout del record di file con il BCD nel nuovo programma per i file di input e output. Modificare la versione di output in modo che non sia compressa. Leggere un record, fare un 'movimento corrispondente' per trasferire i dati e scrivere, fino a eof. Quindi trasferire che il file.

(Possibilità n. 3) Se non è possibile toccare il mainframe, annotare la descrizione nell'articolo collegato nel commento. BCD è relativamente semplice. Si potrebbe essere semplice come questo (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 

ho testato con alcune varianti di questa chiamata:

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

esempio è -40,1. Ma solo alcuni. Quindi potrebbe ancora essere sbagliato.

Allora se il comp-3 inizia, diciamo, dal byte 10 del tracciato record in ingresso, questo potrebbe risolverlo:

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

Notando le formule da questo articolo i dati di conversione per il # di byte per inviare e il numero di 9 prima e dopo V.

Memorizzare il risultato in un decimale per evitare errori di arrotondamento. Esp se è $$$. Float & Il doppio ti causerà dolore! Se non lo stai elaborando, anche una stringa è migliore.

ovviamente potrebbe essere essere più difficile. Dove lavoro, il mainframe è 9 bit per byte. Grave. Questo è ciò che rende le prime 2 possibilità così salienti. Naturalmente ciò che li rende davvero migliori è il fatto che tu possa essere un programmatore per PC e questa è un'ottima scusa per far sì che un programmatore di mainframe esegua il lavoro per te! Se siete così fortunati ad avere questa opzione ...

Pace, -Al

+1

Grazie Al! Potrebbe essere possibile ottenere il programma COBOL modificato o averne scritto un altro da decomprimere, ma l'obiettivo è di farlo in .NET in modo da poter eseguire direttamente attività VSAM -> FTP. Come faccio a sapere dove si trova la V (decimale) in base alla rappresentazione binaria? È possibile? Come sa il mainframe? Grazie ancora, apprezzo il tuo aiuto. –

+0

Josh, non puoi sapere dove si trova la V dai soli dati; hai bisogno del PIC. Il mainframe tiene traccia di esso dal PIC. Tipica soluzione magra, a risparmio di bit dai tempi della punchcard. Ma se ci pensate, non c'è mai un caso in cui il sistema non avrà le informazioni di cui ha bisogno. Diamine, se non riesci a vedere il layout del disco da solo, dovrai comunque modificarlo! – FastAl

+0

Sì, hai ragione, non pensavo che ci sarebbe stato un modo. Ho tutti gli offset determinati e il layout del record è qui, ero solo curioso di sapere se c'era un modo per capire la posizione decimale a livello di codice. Ok, darò una svolta a questa funzione domani e ti farò sapere come funziona! Grazie ancora per il tuo aiuto qui, vorrei poter invocare due volte. –

Problemi correlati