2010-03-01 5 views
7

Bir ana sistemden FTP ile ikili modda indirilen bir VSAM dosyasını okumak için Jon Skeet's EBCDIC implementation in .NET kullanıyorum. Bu kodlamada okuma/yazma için çok iyi çalışır, ancak paketlenmiş ondalık değerleri okumak için hiçbir şeye sahip değildir. Dosyamda bunlar var ve bunları açmam gerekiyor (daha fazla bayt maliyetiyle).Bir ASCII Dönüştürme İçinde EBCDIC Paketli Sınırlamalar (COMP-3) Paketinin Açılması

Bunu nasıl yapabilirim?

Benim alanları PIC S9(7)V99 COMP-3.

+0

EBCDIC biçiminin parçası ondalık paketlenmiş mi, yoksa her ikisini de kullanmak olur bu sadece bir dosyadır? Bu biçime aşina değilim, korkarım :( –

+0

Her ikisini de kullanan bir dosya. Baytları kaydetmek için sayıları sıkıştırmak için eski bir okul yolu: a -99999.99 4 bayt olarak saklanabilir. –

+0

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

cevap

3

Ahh, BCD olarak tanımlanır. 6502 meclisinde kullanırsan Honk.

Elbette, en iyi bahis COBOL MOVE'un işi sizin için yapmasına izin vermektir! Bu olasılıklardan biri yardımcı olabilir.

(Olasılık # 1) Ana sisteme ve kaynak koduna erişiminiz olduğunu varsayar ve çıktı dosyası SADECE kullanımınız içindir, programı değiştiriniz, bu yüzden sadece değeri basit bir ambalajsız PIC S9'a taşıyın (7) V99.

(Olasılık # 2) Bu kadar kolay olmadığınızı varsayarak, (örneğin, başka bir pgms için dosya girilmişse veya kodu değiştiremiyorsanız), sistemde başka bir COBOL programı yazabilir ve bu dosyayı okur ve başka bir yazar. . Dosya kayıt düzenini BCD ile kesin ve giriş ve çıkış dosyaları için yeni programa yapıştırın. Paketlenmemiş olması için çıktı sürümünü değiştirin. Bir kayıt okuyunuz, verileri aktarmak için 'karşılık gelen' yapınız ve yazınız. Ardından, dosyasını dosyasına aktarın.

(Muhtemelen # 3) Ana bilgisayara dokunamıyorsanız, yorumunuza bağladığınız makaledeki açıklamayı not alın. BCD nispeten basittir. Bu (vb.net) bu kadar kolay olabilir:

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 

Ben bu çağrının birkaç varyasyonları ile test:

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

, -40,1 ​​Ör olduğunu. Ama sadece birkaç tane. Yani hala yanlış olabilir.

Yani sonra comp-3 başlar, diyelim ki, giriş kayıt düzeni bayt 10, bu bunu çözmek olsaydı:

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

bayt # veri-dönüşüm makalesinden formüller kaydeden göndermek ve önce ve V.

Mağaza yuvarlama hataları önlemek için bir Decimal sonuç sonrası 9 yılların # için. Evet, eğer $$$. Şamandıra & Double WILL size üzülüyor! Eğer işlemiyorsanız, bir string bile daha iyidir. Tabii

o zor olabilir. Çalıştığım yerde ana bilgisayar bayt başına 9 bittir. Ciddi. İlk 2 olasılığı bu kadar belirsiz yapan şey budur. Elbette onları gerçekten daha iyi kılan şey, sadece bir programcı olan PC'niz olabilir ve bu sizin için bir ana bilgisayar programcısı yapmak için büyük bir bahane!

Barış ... Eğer bu seçeneği vermek kadar şanslı iseniz, -Al

+1

Teşekkürler Al! COBOL programının değiştirilebilmesi ya da paketin açılması için başka bir tane yazılması mümkün olabilir, ancak amaç .NET'de bunu başarmaktır. Bu yüzden sadece VSAM -> FTP görevlerini sorunsuz bir şekilde yürütebiliriz. V'nin (ondalık sayının) ikili temsile dayandığı yeri nasıl bilebilirim? Bu mümkün mü? Ana bilgisayar nasıl biliyor? Tekrar teşekkürler, yardımın için minnettarım. –

+0

Josh, V'nin sadece verilerden nerede olduğunu bilemezsiniz; PIC'ye ihtiyacınız var. Ana bilgisayar, PIC'den izler. Punchcard günlerinde tipik yalın, bit tasarruflu bir çözüm. Ama bunun hakkında düşünürseniz, sistemin ihtiyaç duyduğu bilgilere sahip olmayacağı bir durum yoktur. Heck, plak düzenini kendin göremiyorsan, yine de hacklemen gerekecek! – FastAl

+0

Evet, haklısın, bir yol olacağını düşünmedim. Tüm ofsetleri belirledim ve kayıt düzeni burada, ondalık pozisyonu programsal olarak anlamanın bir yolu olsaydı merak ettim. Tamam, bu işlevi yarın bir koşuşturma yapacağım ve nasıl çalıştığını anlatayım! Yardımınız için tekrar teşekkürler, keşke iki kere daha kazanabilseydim. –

İlgili konular