2024-10-10
ホストのファイル処理でLOW-VALUE,HIGH-VALUEの話が出て混乱する人が出てたので、自分用にもメモを作る
ゾーン形式(Zone),パックドデシマル形式(Packed Decimal)をざっくりいうと
COBOLで言う PIC X(n).
LOW-VALUE, HIGH-VALUEを設定した場合
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 |
ホストの環境によっては
場合もあります。
ゼロも表現が様々あるので、サンプル出力するなどして確認が必要です。
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でも符号情報が先頭に付く場合やゼロの符号の話などもあると思うので、サンプル出力するなどして確認が必要です。