努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:proglang:cobol:cobol-003 から転送されました。
documents:code:other-050

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でも符号情報が先頭に付く場合やゼロの符号の話などもあると思うので、サンプル出力するなどして確認が必要です。

documents/code/other-050.txt · 最終更新: by k896951

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki