目次

ゾーン形式、パック形式

2024-10-10
ホストのファイル処理でLOW-VALUE,HIGH-VALUEの話が出て混乱する人が出てたので、自分用にもメモを作る

概要

ゾーン形式(Zone),パックドデシマル形式(Packed Decimal)をざっくりいうと

文字,文字列

COBOLで言う PIC X(n).

LOW-VALUE, HIGH-VALUEを設定した場合

数値:Zone

COBOLで言う PIC S9(n).
符号が無ければ PIC 9(n). も同じです。

LOW-VALUE, HIGH-VALUEを設定した場合

数字1桁が1バイトに対応し、負の数でなければ数字の文字コードそのままに格納されます。
負の数の場合は一番下の桁のバイトに有符号を意味する文字に置換えされます。EBCDICだと見た目上位4ビットが変換されていてわかりやすいですが、ASCIIの場合はEBCDICの文字に対応したASCIIの文字を割り当てるため分かり辛くなります。
ASCII(2)のパターンはOracleのバルクローダーやGnuCOBOLで使用されていたパターンです。

数字 EBCDIC ASCII ASCII(2)
正の数 負の数 正の数 負の数 正の数 負の数
0 0xF0 0xD0 } 0x30 0x7D } 0x30 0x70 p
1 0xF1 0xD1 J 0x31 0x4A J 0x31 0x71 q
2 0xF2 0xD2 K 0x32 0x4B K 0x32 0x72 r
3 0xF3 0xD3 L 0x33 0x4C L 0x33 0x73 s
4 0xF4 0xD4 M 0x34 0x4D M 0x34 0x74 t
5 0xF5 0xD5 N 0x35 0x4E N 0x35 0x75 u
6 0xF8 0xD6 O 0x36 0x4F O 0x36 0x76 v
7 0xF7 0xD7 P 0x37 0x50 P 0x37 0x77 w
8 0xF8 0xD8 Q 0x38 0x51 Q 0x38 0x78 x
9 0xF9 0xD9 R 0x39 0x52 R 0x39 0x79 y

ホストの環境によっては

場合もあります。
ゼロも表現が様々あるので、サンプル出力するなどして確認が必要です。

数値:Packed Decimal

COBOLで言う PIC S9(n) COMP-3.
数字2桁、最後のバイトは数字1桁+符号情報1桁、を1バイトで表現します。桁数+符号情報が偶数にならない場合は先頭桁にゼロの桁を追加します。
なので、PIC S9(5) COMP-3.とPIC S9(4) COMP-3.は同じバイト形状になります。

※PIC 9(n) COMP-3. は多分正の数の値のみのS9(n) COMP-3.と同じだと思うけど確認はしてない。

LOW-VALUE, HIGH-VALUEを設定した場合

Zone形式と同様にPacked Decimalでも符号情報が先頭に付く場合やゼロの符号の話などもあると思うので、サンプル出力するなどして確認が必要です。