ゾーン10進数とパック10進数のデータ保持方法

COBOL

COBOLプログラムでの入出力が必要なデータ(ファイルや電文)を取り扱う際は、ゾーン10進数とパック10進数を意識する必要があります。
今回の記事では、ゾーン10進数とパック10進数について、どのようなデータの持ち方をしているのか(16進数のバイナリでどのようなデータが格納されるのか)を説明したいと思います。

【ゾーン10進数(符号無し)】

ゾーン10進数とは、簡単に言ってしまえば1バイト(8ビット)で1桁の数値を表現する形式です。
符号無しの場合は、通常の文字列と同じ形式で表現します。

表す数値と表現形式(文字コード)の一覧は以下の通りです。
表現形式については、メインフレームで良く使われるEBCDICと、Windows等のPCで良く使われるASCIIについて記載します。

数値表現形式(EBCDIC)表現形式(ASCII)
0F030
1F131
2F232
3F333
4F434
5F535
6F636
7F737
8F838
9F939

例えば、EBCDICで「123」を表現する時には、「F1 F2 F3」となります。

【ゾーン10進数(符号有り)】

符号有りの数値を表現する場合は、最後の桁の上位4ビットの値により符号を表現します。
表現形式はベンダ各社でまちまちなのですが、例としては以下のように表現します。

符号IBM互換機のメインフレーム(EBCDIC)opensource COBOL(ASCII)
符号無しF3
+C(Fの場合もあり)3
D7

例えば、IBM互換機のメインフレーム(EBCDIC)で「+123」を表現する時には、「F1 F2 C3」となります。
また、「-123」を表現する時には、「F1 F2 D3」となります。

【パック10進数】

パック10進数とは、4ビットで1桁の数値を表す形式です。4ビット(16進数)の値がそのまま1桁の数値になります。
また、最後の4ビットで符号を表し、符号無しの場合は F、+ の場合は C、-の場合は D が入ります。
最終的に1バイト(8ビット)の単位にする必要があるため、桁数が偶数の時(桁数×4ビットと符号4ビットの合計が8ビットの倍数にならない時)は、一番先頭の4ビットに 0 を入れます。

例えば、以下のように表現されます。
・「123」を表現する時…「12 3F」
・「+123」を表現する時…「12 3C」
・「-123」を表現する時…「12 3D」
・「1234」を表現する時…「01 23 4F」

【サンプル】

以下は、opensource COBOL(ASCII)を用いて実際にどのように値が表現されているのかを表したものです。
「1234567890」という値について、「ゾーン10進数(符号無し)」「ゾーン10進数(+)」「ゾーン10進数(-)」「パック10進数(符号無し)」「パック10進数(+)」「パック10進数(-)」の順番に出力しています。

・サンプルコード

IDENTIFICATION DIVISION.
PROGRAM-ID. SIGNTEST.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
 SELECT F1 ASSIGN TO “C:\tmp\a.txt”.
*
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R.
 03 F1-REC PIC X(60).
*
WORKING-STORAGE SECTION.
01 F1-REC-WORK.
 03 F1-REC1 PIC 9(10) VALUE 1234567890.
 03 KAIGYO1 PIC X(02) VALUE X”0D0A”.
 03 F1-REC2 PIC S9(10) VALUE +1234567890.
 03 KAIGYO2 PIC X(02) VALUE X”0D0A”.
 03 F1-REC3 PIC S9(10) VALUE -1234567890.
 03 KAIGYO3 PIC X(02) VALUE X”0D0A”.
 03 F1-REC4 PIC 9(10) COMP-3 VALUE 1234567890.
 03 KAIGYO4 PIC X(02) VALUE X”0D0A”.
 03 F1-REC5 PIC S9(10) COMP-3 VALUE +1234567890.
 03 KAIGYO5 PIC X(02) VALUE X”0D0A”.
 03 F1-REC6 PIC S9(10) COMP-3 VALUE -1234567890.
 03 KAIGYO6 PIC X(02) VALUE X”0D0A”.
*
PROCEDURE DIVISION.
*
* 各種処理の呼び出し
*
000-CONTROLLER-S.
 PERFORM 100-START-S THRU 100-START-E.
 PERFORM 200-MAIN-S THRU 200-MAIN-E.
 PERFORM 300-END-S THRU 300-END-E.
 STOP RUN.
000-CONTROLLER-E.
*
* 前処理
*
100-START-S.
 OPEN OUTPUT F1.
100-START-E.
*
* 主処理
*
200-MAIN-S.
 MOVE F1-REC-WORK TO F1-REC.
 WRITE F1R.
200-MAIN-E.
*
* 後処理
*
300-END-S.
 CLOSE F1.
300-END-E.

・出力結果


金融系だと、仮に自社でCOBOLを使用していなくても、接続先のシステムがCOBOLを使用しているということ良くあります。
データ表現も接続先システムのCOBOLのシステムに合わせなければならないこともあるので、このようなCOBOLの知識が必要になることがあります。

来週も、実務で役立つ情報を提供していきたいと思います!

コメント

タイトルとURLをコピーしました