テキスト フィールドと数値フィールドが混在する COBOL の「テープ形式」ダンプがあります。C# でファイルをバイナリ配列 (バイトの配列) として読み取っています。私はコピーブックを持っており、フォーマットはテキストフィールドにうまく並んでいます. COMP-3 フィールドもいくつかあります。これらのフィールドのデータは、BCD 形式と一致していないようです。私はデータがどうあるべきかを知っており、COMP-3 の生のバイトを持っています。最初に EBCDIC に変換しようとしましたが、良い結果は得られませんでした。それ以外の方法で COMP-3 番号を内部に保存する方法について何か考えはありますか? 以下は、PIC、生データ、および予想される数の 3 つの例です。数字の両側にアルファ データがあり、すべてが正しく並んでいるので、フィールドの位置が正しいことはわかっています。
最初の例: フィールドの PIC は 9(9) COMP-3 データには 5 バイトあり、16 進値は 02 01 20 91 22 です。結果のデータは日付 (00CCYYMMDD) になります。この特定の日付は 3-17-14 である必要があります。
2 番目の例: フィールドの PIC は S9(3) COMP-3 データには 2 バイトあり、16 進値は 0A 14 結果の値は 900 から 999 の間である必要があります。最後のニブルは、+ または - を示すために 0xC または 0xD である必要があります
3 番目の例: フィールドの PIC は S9(15)V99 COMP-3 です データには 9 バイトがあり、16 進値は 00 00 00 00 00 00 01 80 0C です 結果の値は 12.00 になるはずです
正しい方向に私を向けてくれたので、回答してくれた人々に感謝します。これは確かに ASCII/EBCDIC 表現の問題です。BCD は EBCDIC に格納されます。ASCII から EBCDIC への変換テーブルを使用すると、適切にフォーマットされた BCD 数字が生成されます。
このリンクを使用してデータをマッピングしました: http://shop.alterlinks.com/ascii-table/ascii-ebcdic-us.php
私のデータ: 0A 14 変換済み: 25 3C (253 は有効な値であることがわかりました。仕様は間違っていました) C = +、すべて良好
私のデータ: 01 80 0C (先頭のゼロを除く) 変換: 01 20 0C 12.00 C = +, 暗黙の 2 桁の形式, すべて良好
私のデータ: 02 01 20 91 22 変換済み: 02 01 40 31 7F 2014/03/17 (F は未使用のニブル)、すべて良好