2010-08-21-01-異環境データのためのデータ抽象 - project-enigma

2010-08-21-01-異環境データのためのデータ抽象

>> Site top >> weblog >> 月別アーカイブ >> 2010年08月のlog >> 2010-08-21-01-異環境データのためのデータ抽象

最終更新日付:2014/01/02 00:00:00


異環境データのためのデータ抽象

2010 年 08 月 21 日

以前、「コンパイル時点での構成体サイズチェック」という記事を書いた。今回は、その続編とでもいうべきお話。

Windows や UNIX 系の仕事をしていると、ついつい数値というのは 32 ビットや 64 ビットで扱うあれが普通だと思ってしまうものだが、世の中にはそうでない世界も(まだ)あったりする。情報処理技術者試験で勉強した、パック10進やらゾーン10進といったあれだ。パック10進では1桁を1ニブルで( 0x0 〜 0x9 を使って)表現し、符号は 0xC または0xD の独立した1ニブルで表現する。ちなみに符号なしの場合は 0xF だったかな(環境によるのかもしれない)。こうなると、4桁の数値は5ニブルになるため、調整として1ニブルを先頭に 0x0 固定で付加し、合計3バイトで表現する‥‥‥と。つまり、4桁の数値1234 は 0x01, 0x23, 0x4C という3バイトで表現される。

ということは4バイト使っても7桁の数値しか表現できないわけだから、一体何がメリットなのか皆目わからないが、まぁとにかくこんな世界もあるのだ。問題は、Windows やUNIX の世界と『あちら側』でやりとりをする際、こういうデータがインタフェイスで使用されることになると途端に他人ゴトではなくなるということだ。

以前の記事では、ベタ詰め文字列の先頭ポインタを構造体にキャストするイメージで書いていたが、今回は上記のような各種の異環境データがバイナリイメージでベタ詰めにされたブロックを直接扱う必要がある。そこで、以前のように構造体にキャストしたいわけだ。これが意味するのは、たとえばパック10進の数値をクラス化するとして、桁数をコンストラクタに与えてダイナミックヒープ上に必要なメモリを確保するといった方策がとれないということだ。それではベタ詰めのメモリブロックをキャストしてそのまま使用することはできないからだ。オブジェクトのレイアウトが実際のバイナリデータのイメージと完全に合致するようにしなければならない。

ここでも、解決に使用されるのはクラステンプレートだ。詳細は面倒なので省くとして、S9COMP3 は符号付きパック10進、X は(EBICDI[CK]の)文字列、S9 は符号付きのゾーン10進だ。全てテンプレートパラメータとして桁数を指定する。それを構造体に収めてみると、以下のような感じになる。

  struct Record {
      S9COMP3<4>    key1;
      S9COMP3<3>    key2;
      X<12>         data1;
      S9<4>         data2;
      X<26>         data3;
      X<42>         filler;
  };

これらのデータ抽象は、全て C/C++ のデータ型との相互変換や比較演算をメソッドとして提供する。しかし、数値型に関しては operator++ や operator += などの算術演算子メンバ、および大域 operator+ などのサービスは現状では提供していない。これはまぁ単純に面倒(かつひとまず必要としていない)からで、必要なら作成することができる。

わざわざこういったデータ抽象を作成する理由は明白だ。『コードがシンプルになる』、それにつきる。実際、全てを unsigned char 配列にして各メンバをデータ種別ごとに関数でデータ変換する、といったありがちな C言語実装と比較してみてほしい。コードはごちゃごちゃしてわかり難く、いたるところにバグのリスクを抱えたものになるだろう。C++ は闇雲に忌避されることが多いが、こういった基盤構造に C++ を使用し、上位の業務ロジック的な部分では C 言語の感覚で実装をする‥‥‥という方針なら受け入れてもらえるのではないかと思う。

ひとまず昼間の仕事で当面必要な実装はできているのだが、将来的に必要になりそうなのがビット表現のデータ項目だ。これを上手く表現する方法を今考えている。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.