hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
ファイルフォーマット解析 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

ファイルフォーマット解析

 HSPで外部ファイルを扱うにはプラグインを利用することによりあらゆる画像ファイルをロード・セーブすることができるが、これには外部プラグイン(DLL)が必要になってくる。
このページではプラグインを一切使わずにHSP側でファイルのロード・セーブ・またはバイナリ操作をするためのモジュールを開発するためのものとなっています。

ファイルフォーマット参考サイトリンク

実装予定・修正点

  • binary関数命令の全面的修正
    • 終端コードでブロックとして区分けしていた方法と、指定した16進数データの差を計算して
      位置を指定する方法二通りを作成する。JPEG GIF等は後者の方法を採用していた。
  • binary関数命令を利用した方法 簡単なバイナリ操作として実装予定
    • MP3タグ編集

注意点

  • 終端コードを区切り文字として利用したモジュールにおいてファイル内に改行コード(13)が^ 含まれていた場合重大なバグに陥る。
  • bload命令で読み込むファイルのサイズ分だけ予めメモリを確保しておく
  • 区切り文字(00)が含まれているために通常の文字列操作(getstr,strmid,instr)は不可能
  • 保存時には各要素に区切り文字コードを付加する
  • bsaveでセーブを行った場合NULL文字が消えてしまう。よってオフセットを指定し保存しなければならない。

基本バイナリ操作モジュール

始点コードからの差を利用した方法 <<開発中>>

+  Open

NULL文字(00)で分割し配列変数に区分けする方法 <<開発終了>>

+  Open

画像のサイズを取得

コメント

  • 冒頭の説明がいまいちピンと来ないのですが、具体的なものがアップされるまで様子を見ておきます^^; -- kz3
  • HSP上でバイナリを操作してGIFなどの形式でファイルを保存するモジュールです。 -- As 2006-12-01 (金) 01:09:58
  • bloadはコード00でロード中断するようなことはありませんよ? -- kz3 2006-12-01 (金) 07:07:10
  • バイナリについてほとんど参考にしないで作っていきましたが、、、ロードした際に、区切りごとに配列変数に割り振って、bainarygetで配列変数を参照する形に修正していけばもう少し高速化できるかもしれません。 -- As 2006-12-01 (金) 07:30:41
  • 実際実行してみたのですがコード00で中断されてしまうようですよ。いくらpeekで値を取得しようとしてもエラーが帰ってきてしまって…いろいろ原因を調べたらメモリにコード00までの値しか代入されていませんでした>< -- As 2006-12-01 (金) 07:32:31
  • 今いろいろと試してみましたが、本当に取得できているようですね^^; mes命令などは00で描画を終了することに初めて気が付きました>< 随時修正いたします。ファイル等細かいバイナリ操作のモジュールを作成するのはそれからになるかと。 -- As 2006-12-01 (金) 07:39:58
  • ちょっとここで、テキスト(ファイル)とバイナリ(ファイル)の違いについて一言。例えばファイルに「100」という情報を記録することを考えてみると、テキストの場合は「100」をキャラクターコードで記録します。つまり、ファイルには16進数で表現すると
    31 30 30
    というデータが書き込まれています。
    一方バイナリの場合は「100」をそのまま数値で記録します。(エンコードなどは考えない)
    つまり、ファイルには16進数(32bit整数)で表現すると
    64 00 00 00
    というデータが書き込まれています。(バイトオーダーにより異なる)
    バイナリデータの場合に重要なのは一つのデータが何bit、何バイトなのかということで、後者の「100」は「64000000」が一つのデータ――ブロックと考えられます。-- kz3 2006-12-03 (日) 04:29:13
  • ファイルはバイナリデータの塊であり、その中でデータが文字のみのものをテキストファイルと呼んだりする。
  • 参考にさせていただきました。バイナリというものに全くの無知でありまして、今まで手を触れていなかった部分でもありましたのでどういう仕組みなのかすらわからず、GIFファイルをバイナリエディタで開いて見てはの繰り返しでした。そこでブロックの存在に気づきました。また、
    64 00 00 00  
    の場合においてですが、00というNULL文字でブロックは区切られているのでしょうか? もしそうだとすれば、6400 00 00 という3つのブロックができるとおもうのですが違うのでしょうか?-- As 2006-12-03 (日) 06:54:33
  • 一般的にNULL文字というのはプログラム内であつかう文字列の終端コードを指します。バイナリファイル中の0はNULL文字とは(普通)呼びません。そもそも文字かどうかも分からないのがバイナリデータです。(それが分かるのはフォーマットを知っている者だけです。)また『64000000』(16進)というバイナリデータは3つのブロックから成っているかどうかということですが、それもフォーマット次第です。中身の同じデータでさえ、そのデータを読み書きするプログラムが定義するフォーマットによって1バイトを1ブロックとするか、4バイトを1ブロックとするか、異なってきます。 -- kz3 2006-12-03 (日) 07:25:25
  • なるほど…詳しく説明していただき有難うございます。それぞれのフォーマット形式によってバイナリの扱い方が異なるということですね。それにあわせて、只今JPGに関するフォーマットについて調べていたのですがJPGの場合はブロックに関係なく最初から2byte,2byte,4byte…となるようで…binary関数命令を拡張しないとJPGは扱えないようです。そこで、マーカを始点としてそこから○バイト離れている場所から○バイト取得するような関数を作りたいのですが、その関数の名前として適切なのはどういったものになるでしょうか? マーカの意味もわかっていないので自分では不安です^^; 参考:マーカ -- As &new{2006-12-03 (日) 07:44:43}
  • マーカという名称は仕様を作った人(団体?)が適当につけた名称だと思います。意味からして識別子・タグ・シグネチャみたいなものだと思います。(axファイルの先頭に必ずある"HSP3"みたいなもの) -- kz3 2006-12-03 (日) 07:56:37
  • 本当にバイナリの仕様というものは全く決まってないものなのですね。新定義命令としてbinaryspsel binaryspget binaryspset を追加したいと思います。 -- As 2006-12-03 (日) 08:30:12
  • なんとかバイナリを操作する上で必要な関数を定義いたしました。これでほとんどのファイルは操作できるかと。ただまだバグがあるかもしれません^^; -- As 2006-12-03 (日) 18:53:11
  • 指定されたエリアに値を「追加」するにはどういった方法がより高速化につながるでしょうか? -- As 2006-12-03 (日) 23:49:24
  • #mem -- As 2006-12-12 (火) 14:09:29
  • #memcpy系の命令の存在を忘れていました…(笑) -- As 2006-12-12 (火) 14:09:55
  • 久々に更新いたしました。まだまだ重要なバイナリデータの保存とまではいきませんが、バイナリデータの指定した始点コードから値を取得できるようなりました。ソースでは画像の大きさなどの情報を取得するサンプルも含まれています。 -- As 2006-12-23 (土) 17:28:05
  • 一通りPNGなどのファイルフォーマットについてサイトを巡ってきましたが、deflate圧縮やLZW圧縮技術などのアルゴリズムがまったくいってわかりませんでした…。DLLを使わないで読み込むとなると恐ろしい労力がかかりそうです。 -- As 2006-12-23 (土) 23:21:48
  • これってソフト開発?w -- 2007-11-03 (土) 07:09:43

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filebinary_old.hsp
269件 [詳細]
filebinary.hsp
375件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-11-03 (土) 07:09:43 (2227d)