大丈夫です。 Byerkut さんも深くは理解していません。
突然ですが、コンピュータのデータはバイト単位で管理されることはご存じでしょうか。緻密なグラフィックも膨大なデータベースのデータも突き詰めるとバイト単位で保存されているのです。
しかし、実はここに問題があるのです。
ご存じかとは思いますが1バイトが表現できる数値の範囲は 0 ~ 255 です。昔のゲームなどではステータスの上限が 255 だったりすることがありますよね。ですが、 0 ~ 255 までの数値があればゲームは成り立つでしょうか?それは、おそらく無理です。ファミコン時代のドラクエでもゴールドは 999999 くらい持てますので 0 ~ 255 では数値が足りません。では、いったいどうすれば大きい数値を扱うことができるのでしょうか?普段からプログラミングをしていないと意識できないかもしれませんが、実は簡単なのです、「1バイトで足りないなら2バイト使ってしまえ!」ば良いのです。
かくして大きなデータを扱う際にはnバイト使えばいいことがわかりました。しかし、問題はここにあるのです。
何が問題なのかというと、nバイトのデータを保存する際、データをどういう順番で詰めるか?が CPU などによって異なっているという点です。たとえば 1234 という数値をファイルに保存したいとします。 1234 を表現するには2バイト必要なのですが、それぞれのバイトの値は 0×04 と 0xD2 になります(← 16 進数表記です)。ここで Intel の CPU のマシンで 1234 という数値を保存すると、ファイルへはデータが 0xD2 0×04 という順番で保存されます。 Intel の CPU では下の位から順番にデータを詰めることがわかります。一方 IBM などのメインフレームでは 1234 という数値を保存すると 0×04 0xD2 というように上の位からデータを詰めたりします。前者の環境をリトルエンディアン、後者の環境をビッグエンディアンと呼びます。
コンピュータにはリトルエンディアンとビッグエンディアンがあることがわかりました。ファイルへデータを保存したり、ファイルからデータを取得したりする際には注意しなければなりません。 Windows などの Intel マシンでのみ動作すれば良いのであればリトルエンディアンを前提にプログラムすればいいのですが、他の環境へ移植したい場合はバイトオーダーを意識してプログラムを分岐する必要があります。こういった作業はつまらない上に面倒です。
ここで POSH の登場です。
POSH ライブラリを使うと、バイトオーダーの違いを理解して適切にデータを保存したり読み込んだりするマクロや関数が使えるようになります。プログラマは「 1234 という数値を保存したい」という一念だけで移植性のあるプログラムを書くことができるようになります。面倒から解放されてとても楽になります。ぜひとも利用を検討してください。
実際はゲームの開発で移植性を考えると、「相手が組み込みでも通じるソースになるのか?」とか「例外やメタプログラミング機能のない C++ でも同じ動作をするのか?」など、いろいろな問題に直面します(実はゲーム会社在籍時代は移植もやっていました)。こうなっては POSH の力はほとんど無力ですので、最初から移植性は無視して利用しないという決断もありかと思います。
Comments
POSHのライセンスはどうなっているのでしょうか
一応HPで確認しましたが
GPLでは無いですよね
GPLで某「葉」さんの二の舞は避けたいので…
なんというか……リトルエンディアンとかビッグエンディアンとか手法を分けたりせずに統一して欲しいと強く思います(苦笑)
高校時代にゲームボーイの改造ツールをちまちまいじってたのでデータの扱い方を覚えるのは余裕だったのですが、いつもいつもリトルエンディアンかビッグエンディアンか迷ってRGBの色合いがおかしくなったり、意味不明な不具合がおきそうで怖くなります。
まぁ、2バイトや4バイト等の変数を1バイト単位で扱わなければいいだけの話なんですけどね。
画像のピクセルデータをRGBA(赤、緑、青、アルファチャンネル)の4バイトで扱い、それぞれを1バイト単位の演算をかけたりするときには参考書と睨めっこしたり、難度もテストしながら組んでます~。
> yomogi さん
そうなんです GPL ではないので慎重な姿勢が必要です。
私は存じてなかったのですが、ゲームでも権利関係のゴタゴタってあったんですね。
OSS を使う際には真っ先に注意が必要です…
>たつにいさん
バイトオーダーは一長一短ですからね。
メインフレームや組み込みやネットワークを考えると、
まだまだ我々の苦悩は続きそうです。
Contributions