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
è imballato decimale parte del formato EBCDIC, o è solo un file che succede ad usare entrambe le cose? Non ho dimestichezza con questo formato, temo :( –
È 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. –
http://www.3480-3590-data-conversion.com/article-packed-fields.html –