2010年8月30日月曜日

日記ちゃんaiff(2)

 mmioDescendが使えそうだなと試してたんだけど、これがぜんぜんうまく動かない。
ビッグエンディアンがいけないのか、関係ないのか分からんが
しょっぱなの'FORM'を'MROF'とかやっても無理だった。
 
 しかたがないので各チャンクの頭に飛べるよう以下みたいな、
4バイト一致するデータへのアドレスを取得する関数を書いて、自分でreadしてテストしてみたところうまく読み込めた。
高速化とかはしてない。変数名は自分でもどうかと思うがテストだったからつい。
最初はstrstr()を使おうとしたんだけどバイナリに0があったら終わるということ失念してたよ……。

char* memSearch( char* buf, int bufSize, DWORD bin )
{
  const int n = bufSize - sizeof(bin);
  for (int i=0; i<n; ++i)
  {
    DWORD now = static_cast(buf[0]) |
      static_cast(buf[1])>>8 |
      static_cast(buf[2])>>16 |
      static_cast(buf[3])>>24;
    if ( now == bin ) return buf;
    buf++;
  }
 
  return NULL;
}

 
 これで各チャンクのデータは取れるようになったはずなので、
バイトオーダーと80bit浮動小数点数をどうにかすれば読み込み可能になるかも。
CommonChunkが18Byteとサイズが半端でちょっとひっかかった。
構造体にすると20Byteに肥大化する。

0 件のコメント: