002.ゾーン形式、パック形式
2024-10-10
ホストのファイル処理でLOW-VALUE,HIGH-VALUEの話が出て混乱する人が出てたので、自分用にもメモを作る
概要
ゾーン形式(Zone),パックドデシマル形式(Packed Decimal)をざっくりいうと
- ゾーン形式は数値の1桁を1バイトで表す
- パックドデシマル形式は数値の桁を 数字2桁もしくは数字1桁+符号情報 で区切り1バイトで表す
- どちらの形式も、0x00で埋めたものがLOW-VALUE、0xFFで埋めたものがHIGH-VALUE
- メインフレーム(ホスト)のCOBOL等で生成する数値の形式
文字,文字列
COBOLで言う PIC X(n).
LOW-VALUE, HIGH-VALUEを設定した場合
数値:Zone
COBOLで言う PIC S9(n).
符号が無ければ PIC 9(n). も同じです。
数字1桁が1バイトに対応し、負の数でなければ数字の文字コードそのままに格納されます。
負の数の場合は一番下の桁のバイトに有符号を意味する文字に置換えされます。EBCDICだと見た目上位4ビットが変換されていてわかりやすいですが、ASCIIの場合はEBCDICの文字に対応したASCIIの文字を割り当てるため分かり辛くなります。
ASCII(2)のパターンはOracleのバルクローダーやGnuCOBOLで使用されていたパターンです。
→VAXスタイルというべきか。参考:https://archive.org/details/bitsavers_decvaxarchrenceManualRev5Feb79_23629245/page/n33/mode/2up?q=Zoned
DEC の概要 設立:1957 年(米国マサチューセッツ州メイナード) 創業者:ケン・オルセン、ハーラン・アンダーソン 主力製品:PDP シリーズ、VAX シリーズ、Alpha、DECnet、VT100、StrongARM 最盛期の従業員数:14 万人以上(1987 年) 買収:1998 年に Compaq が買収 → 2002 年に HP が Compaq を吸収 Alpha → HP Integrity / Itanium へ影響 StrongARM → ARM アーキテクチャの発展に寄与 VMS → 現在も OpenVMS として稼働 引用:Wikipedia?(Copilotの説明)
| 最終桁の数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 備考 | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EBCDIC | 正 | 0xF0 | 0 | 0xF1 | 1 | 0xF2 | 2 | 0xF3 | 3 | 0xF4 | 4 | 0xF5 | 5 | 0xF6 | 6 | 0xF7 | 7 | 0xF8 | 8 | 0xF9 | 9 | 正:数字文字そのまま |
| 負 | 0xD0 | } | 0xD1 | J | 0xD2 | K | 0xD3 | L | 0xD4 | M | 0xD5 | N | 0xD6 | O | 0xD7 | P | 0xD8 | Q | 0xD9 | R | 負:上位4ビットが0xD | |
| ASCII | 正 | 0x30 | 0 | 0x31 | 1 | 0x32 | 2 | 0x33 | 3 | 0x34 | 4 | 0x35 | 5 | 0x36 | 6 | 0x37 | 7 | 0x38 | 8 | 0x39 | 9 | EBCDICの文字を ASCIIの文字に変換 |
| 負 | 0x7D | } | 0x4A | J | 0x4B | K | 0x4C | L | 0x4D | M | 0x4E | N | 0x4F | O | 0x50 | P | 0x51 | Q | 0x52 | R | ||
| ASCII(2) | 正 | 0x30 | 0 | 0x31 | 1 | 0x32 | 2 | 0x33 | 3 | 0x34 | 4 | 0x35 | 5 | 0x36 | 6 | 0x37 | 7 | 0x38 | 8 | 0x39 | 9 | 正:数字文字そのまま |
| 負 | 0x70 | p | 0x71 | q | 0x72 | r | 0x73 | s | 0x74 | t | 0x75 | u | 0x76 | v | 0x77 | w | 0x78 | x | 0x79 | y | 負:上位4ビットが0x7 | |
定義例
| 定義 | EBCDIC | ASCII | ASCII(2) | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 位置 | 位置 | 位置 | |||||||||||||||||
| 定義 | 値 | +0 | +1 | +2 | +3 | +4 | +5 | +0 | +1 | +2 | +3 | +4 | +5 | +0 | +1 | +2 | +3 | +4 | +5 |
| PIC 9(1). | 8 | 0xF8 | 0x38 | 0x38 | |||||||||||||||
| PIC S9(1). | 8 | 0xF8 | 0x38 | 0x38 | |||||||||||||||
| PIC S9(1). | -8 | 0xD8 | 0x51 | 0x78 | |||||||||||||||
| PIC 9(1). | LOW-VALUE | 0x00 | 0x00 | 0x00 | |||||||||||||||
| PIC S9(1). | LOW-VALUE | 0x00 | 0x00 | 0x00 | |||||||||||||||
| PIC 9(1). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | |||||||||||||||
| PIC S9(1). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | |||||||||||||||
| PIC 9(4). | 2026 | 0xF2 | 0xF0 | 0xF2 | 0xF6 | 0x32 | 0x30 | 0x32 | 0x36 | 0x32 | 0x30 | 0x32 | 0x36 | ||||||
| PIC S9(4). | 2026 | 0xF2 | 0xF0 | 0xF2 | 0xF6 | 0x32 | 0x30 | 0x32 | 0x36 | 0x32 | 0x30 | 0x32 | 0x36 | ||||||
| PIC S9(4). | -2026 | 0xF2 | 0xF0 | 0xF2 | 0xD6 | 0x32 | 0x30 | 0x32 | 0x4F | 0x32 | 0x30 | 0x32 | 0x76 | ||||||
| PIC 9(4). | LOW-VALUE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||||||
| PIC S9(4). | LOW-VALUE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | ||||||
| PIC 9(4). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | ||||||
| PIC S9(4). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | ||||||
| PIC 9(5). | 2026 | 0xF0 | 0xF2 | 0xF0 | 0xF2 | 0xF6 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 | |||
| PIC S9(5). | 2026 | 0xF0 | 0xF2 | 0xF0 | 0xF2 | 0xF6 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 | |||
| PIC S9(5). | -2026 | 0xF0 | 0xF2 | 0xF0 | 0xF2 | 0xD6 | 0x30 | 0x32 | 0x30 | 0x32 | 0x4F | 0x30 | 0x32 | 0x30 | 0x32 | 0x76 | |||
| PIC 9(5). | LOW-VALUE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||
| PIC S9(5). | LOW-VALUE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | |||
| PIC 9(5). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | |||
| PIC S9(5). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | |||
| PIC 9(6). | 2026 | 0xF0 | 0xF0 | 0xF2 | 0xF0 | 0xF2 | 0xF6 | 0x30 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 | 0x30 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 |
| PIC S9(6). | 2026 | 0xF0 | 0xF0 | 0xF2 | 0xF0 | 0xF2 | 0xF6 | 0x30 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 | 0x30 | 0x30 | 0x32 | 0x30 | 0x32 | 0x36 |
| PIC S9(6). | -2026 | 0xF0 | 0xF0 | 0xF2 | 0xF0 | 0xF2 | 0xD6 | 0x30 | 0x30 | 0x32 | 0x30 | 0x32 | 0x4F | 0x30 | 0x30 | 0x32 | 0x30 | 0x32 | 0x76 |
| PIC 9(6). | LOW-VALUE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
| PIC S9(6). | LOW-VALUE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
| PIC 9(6). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
| PIC S9(6). | HIGH-VALUE | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF | 0xFF |
ホストの環境によっては
- 符号が一番上の桁のバイトに割り当てられる
- 正の数を意味する符号が割り当てられる
場合もあります。
ゼロも表現が様々あるので、サンプル出力するなどして確認が必要です。
数値:Packed Decimal
COBOLで言う PIC S9(n) COMP-3.
数字2桁、最後のバイトは数字1桁+符号情報1桁、を1バイトで表現します。桁数+符号情報が偶数にならない場合は先頭桁にゼロの桁を追加します。
なので、PIC S9(5) COMP-3.とPIC S9(4) COMP-3.は同じバイト形状になります。
| 最終桁の値 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 備考 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| PIC 9(n) COMP-3. 時の最終バイト | 0x0F | 0x1F | 0x2F | 0x3F | 0x4F | 0x5F | 0x6F | 0x7F | 0x8F | 0x9F | 下位4ビットが0xF |
| PIC S9(n) COMP-3. 時で正数の最終バイト | 0x0C | 0x1C | 0x2C | 0x3C | 0x4C | 0x5C | 0x6C | 0x7C | 0x8C | 0x9C | 下位4ビットが0xC |
| PIC S9(n) COMP-3. 時で負数の最終バイト | 0x0D | 0x1D | 0x2D | 0x3D | 0x4D | 0x5D | 0x6D | 0x7D | 0x8D | 0x9D | 下位4ビットが0xD |
定義例
| 値 | 8 | -8 | 2026 | -2026 | LOW-VALUE | HIGH-VALUE | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 定義 | 位置 | 位置 | 位置 | 位置 | 位置 | 位置 | ||||||||||||||||||
| +0 | +1 | +2 | +3 | +0 | +1 | +2 | +3 | +0 | +1 | +2 | +3 | +0 | +1 | +2 | +3 | +0 | +1 | +2 | +3 | +0 | +1 | +2 | +3 | |
| PIC 9(1) COMP-3. | 0x8F | – | – | – | 0x00 | 0xFF | ||||||||||||||||||
| PIC S9(1) COMP-3. | 0x8C | 0x8D | – | – | 0x00 | 0xFF | ||||||||||||||||||
| PIC 9(4) COMP-3. | 0x00 | 0x00 | 0x8F | – | 0x02 | 0x02 | 0x6F | – | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | ||||||||||
| PIC 9(5) COMP-3. | 0x00 | 0x00 | 0x8F | – | 0x02 | 0x02 | 0x6F | – | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | ||||||||||
| PIC 9(6) COMP-3. | 0x00 | 0x00 | 0x00 | 0x8F | – | 0x00 | 0x02 | 0x02 | 0x6F | – | 0x00 | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | 0xFF | ||||||
| PIC 9(7) COMP-3. | 0x00 | 0x00 | 0x00 | 0x8F | – | 0x00 | 0x02 | 0x02 | 0x6F | – | 0x00 | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | 0xFF | ||||||
| PIC S9(4) COMP-3. | 0x00 | 0x00 | 0x8C | 0x00 | 0x00 | 0x8D | 0x02 | 0x02 | 0x6C | 0x02 | 0x02 | 0x6D | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | ||||||
| PIC S9(5) COMP-3. | 0x00 | 0x00 | 0x8C | 0x00 | 0x00 | 0x8D | 0x02 | 0x02 | 0x6C | 0x02 | 0x02 | 0x6D | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | ||||||
| PIC S9(6) COMP-3. | 0x00 | 0x00 | 0x00 | 0x8C | 0x00 | 0x00 | 0x00 | 0x8D | 0x00 | 0x02 | 0x02 | 0x6C | 0x00 | 0x02 | 0x02 | 0x6D | 0x00 | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | 0xFF |
| PIC S9(7) COMP-3. | 0x00 | 0x00 | 0x00 | 0x8C | 0x00 | 0x00 | 0x00 | 0x8D | 0x00 | 0x02 | 0x02 | 0x6C | 0x00 | 0x02 | 0x02 | 0x6D | 0x00 | 0x00 | 0x00 | 0x00 | 0xFF | 0xFF | 0xFF | 0xFF |
Zone形式と同様にPacked Decimalでも符号情報が先頭に付く場合やゼロの符号の話などもあると思うので、サンプル出力するなどして確認が必要です。
