指向性メモ::2007-01-29::Adaでpack的なことをする場合

ページ情報
制作日
2007-01-29T20:50:53+09:00
最終更新日
2007-01-29T20:50:53+09:00
ページ内目次

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に準拠した展開をしないといけない。

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

Comments

Trackbacks

Trackback Ping URI

http://yudai.arielworks.com/memo/2007/01/29/205053.trackback

末尾に「3 + 5」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「205053.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

Name (optional)
Email address or URI (optional)
Do the math below (required to filter comment spams)
3 + 5 + 8 =
Message (required)
Submit
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator