【PL/I学習|豆知識】メインフレームの「VARYING文字列」に潜む罠—2バイトの長さヘッダと向き合う

1. 導入

メインフレーム開発において、可変長文字列(VARYING)はメモリ効率と可読性の両立に欠かせない機能です。しかし、その便利な仕組みの裏側にある「先頭2バイトの長さ情報」を意識せずにデータを扱うと、他システムとの連携時に深刻なデータ破損や誤読を招きます。本稿では、この物理的な制約と、正しくデータを扱うための実装ポイントを解説します。

2. 基礎知識

VARYING属性を持つ文字列は、内部的に「2バイトの長さ情報(ヘッダ)」+「実際の文字列データ」という構造で格納されます。
この2バイト(16ビット)の領域が表現できる最大値が32767であるため、伝統的に最大長は32767バイトに制限されてきました。現代のコンパイラでは拡張されている場合もありますが、ファイルシステムや古いロードモジュールとの互換性を維持する場合、この「2バイトヘッダ」の存在が依然として境界条件となります。特に、メインフレームから出力したファイルをWindowsやLinuxで読み込む際、この2バイトをデータの一部と誤認するトラブルが後を絶ちません。

3. 実装/解決策

他システムへデータを渡す際は、VARYING属性のまま出力するのではなく、一度固定長(CHAR)のバッファへコピーするか、明示的に長さ情報を除外してバイナリ転送する処理が必要です。PL/Iなどで実装する場合、SUBSTR関数を利用してデータ部のみを抽出するのが最も安全な手法です。

4. サンプルプログラム

以下は、VARYING文字列から、ヘッダを除いた純粋なデータ部分のみを抽出して格納する処理の例です。

/ VARYING文字列からデータ本体のみを抽出するサンプル /
DCL VARYING_DATA CHAR(32767) VARYING INIT(‘メインフレーム技術’);
DCL FIXED_BUFFER CHAR(32767);
DCL DATA_LEN FIXED BIN(15);

/ 1. 現在の文字列長を取得 /
DATA_LEN = LENGTH(VARYING_DATA);

/ 2. 文字列の長さが0より大きい場合のみ処理 /
IF DATA_LEN > 0 THEN DO;
/ 3. SUBSTRでデータ部のみを固定長変数へコピー /
FIXED_BUFFER = SUBSTR(VARYING_DATA, 1, DATA_LEN);
END;

/ 4. このFIXED_BUFFERをファイル出力や通信に利用することで、
余計な2バイトヘッダの混入を防ぐことができます /

5. 応用・注意点

現場での開発において陥りやすいのは、「VARYINGであることを忘れてファイルを直接読み書きすること」です。特にCOBOLやC言語など、異なる言語間でデータをやり取りする場合、相手側は「データ本体」のみを期待していることがほとんどです。
補足として、もし大量のデータを扱う際にこの制限を回避したい場合は、VARYINGを使用せず、長さ情報を別フィールド(FIXED BIN(31)など)として管理する「手動可変長形式」を採用することも検討してください。これにより、言語やアーキテクチャの境界を超えて、より堅牢なデータ連携が可能になります。

コメント

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