Adaでpack的なことをする場合

AdaでByte列から特定の型を得たい場合、Unchecked_Conversionで変換する方法があり得る。

ただし、この方法では、バイト列の順は意識されない。Intelのアーキテクチャならば恐らくメモリ上ではLittle Endianで表現されているが、入力側のファイルなどがLittle Endianである保証はない。今回扱いたいTFFフォーマットの場合、最初の2byteで指定されたエンディアンで読み込む必要がある。

Tiffのリビジョン6以前ならば、定義された型がSHORT(16bit unsigined integer)、LONG(32bit unsgined integer)にASCII(7bit unsigned integer, null terminated)、BYTE(8bit unsigned integer)、Rational(two LONG)と単純なので、前回の記事の方法でもまだ何とかなる。気持ちが悪いところといえば、ASCIIのNULL終端を捨てるのにビットシフトしたいところだが、しょうがなく2で割るぐらいだ。

しかし、リビジョン6以降のTIFFでは既存の型全てにSigned型が追加されている。いわゆる2の補数で表現されているので、1bit目が1か0かで場合分けして、負の場合は2#10000000_...#から値を引くのだが、これがなかなかめんどくさい(もしかしたらもっと簡単にできるのだろうか)。さらに、FloatとDoubleも加わるので、IEEEに準拠した展開をしないといけない。

比較的よくある操作だと思うので、何か既に解決策がありそうなものだが、どうしたものだろうか。