2016-04-29 13 views
1

ユーティリティパッケージ(vsmr)を使用してVSAMファイルの値を読み取りました。コピーブックソースコードを利用できます。cobolプログラムを記述しないで、パックされたPIC cobol節のvsamファイルから数値を判別する方法は?

私は以下のように定義(書式設定を言い訳してください)

01 RECORD 
    05 RECORD-X PIC S9(3)V99 COMP-3 
    05 RECORD-Y PIC S9(3)V99 COMP-3 
    05 RECORD-Z PIC S9(3) COMP-3 
    05 RECORD-ALPHA PIC X(10) 

を持っていると私は私がどのようにデータ

00 20 0C 01 10 0C 01 00 0C

に、次のしている場合RECORD-Xの数値を決定しますか?

RECORD-Xは3バイト、00-20 0CはRECORD-Xの値に相当しますが、これを人間が判読可能な値に変換する方法はわかりません(アルゴリズム的には必ずしもプログラム的ではありません)。

また、0110Cの値がRECORD-Yの値に対応すると仮定します。私の前提は正しいですか?

+0

RECORD-Zに表示するデータと値の間に矛盾があります。 RECORD-zの長さは2バイト(2バイト)で、2バイトの場合、後ろに操作標識がないので、プログラム内のフィールドを使用すると簡単に「異常終了」(プログラム障害)が発生する可能性があります。次のバイトの下位ニブルに正しい見た目の値があるので、定義が間違っている可能性があります。 –

+1

読むのは簡単です。バイナリコード化小数点は、「バイナリ」フィールドの小数点以下桁数です。 COMP-3/PACKED-DECIMALの場合、符号は、説明されているように下位半バイトにあります。通常はC(正)D(負)とF(符号なし、正として扱われます)を参照してください。しかし、言及された他の値も可能ですので、変換したい場合は無視することはできません失敗として)。小数点は常に暗黙指定されているため、データ記述(PICture句)を使用して、小数点がある場合は小数点があるかどうかを判断する必要があります。 Vの後のものは小数点以下のものです。 –

答えて

4

COMP-3は、Binary Coded Decimal(BCD)の実装です。 1バイトの各ニブルは数字に対応し、最後のニブルは記号を保持します。どこで...

00 20 0C 01 10 0C 01 00 0C 

...私たちは、RECORD-Xに最初の3つのバイトをマップし、002.00の値を持つことができています。 C、A、F、またはEの値を持つ符号ニブルは、算術的に正とみなされます。 BまたはDの値を有する符号ニブルは、算術的に負であると考えられる。小数点はデータにエンコードされていません。フィールド定義がある場所を知る必要があります。

IBM Enterprise COBOLには、「好意的な記号」という概念があります。これは正の場合はC、負の場合はDです。あなたのデータがすべて「好きな兆候」であると確信しているならば、最適化を利用することができます。

RECORD-Yについてのあなたの仮定は正しいです、その値は+11.00です。

COBOLを書く場合は、これを人間が判読可能な値に変換するアルゴリズムを実装する必要はありません。MOVE RECORD-X TO RECORD-X-DISPLAYPIC +999.99と定義されています。

+1

最後のニブルはCなので、負の場合はDと正の差を意味します。また、002.00と等価な00200もありますか? RECORD-Yは11.00ですか?あなたがこれをカバーするために少しだけ答えを広げることができたら、私はこれを私の質問の答えとして受け入れたいと思っています。 –

+0

あなたのコピーブックによると、Recor-XとRecord-Yは小数点より3桁前です。はい、Cは正(覚えていること:Cはクレジット、Dはデビット)を意味します。だから00 21 5C 01 23 8D 00 1Cはあなたのグリッドで+002.15 -012.38 +001 – gazzz0x2z

関連する問題