いけむランド

はてダからやってきました

phozzil (1)

探してみたら IO_Bit というのもありました。

string をがっつり渡して、integer などに変換するインタフェースっぽい。resource から string にするまでは関与しないということらしい。


以下、これらを踏まえてのインタフェースについての考察を述べてみる。

string ≒ byte[] ?

PHP は基本的に resource からの入出力データインタフェースが string である。そのため、バイナリデータを扱うためには string に対して pack / unpack や ord を使うのが定石っぽい。

PHP の文字列は言語仕様を見ると Java における byte[] に近い *1 とは言え、ストリームからのデータが string を経由することを利用者が意識しないといけないのはあんまりスマートじゃない気がするため、resource を渡したオブジェクトから直接 readXXX したら、その型のデータで得られるインタフェースが望ましいのではないかと思っている。(つまり java.io っぽいやつ)

エンディアン

バイナリデータを扱う場合に出てくるもう一つの問題がエンディアンで、これもライブラリによっていろいろ扱いが異なっている。

java.io ではビッグエンディアン決め打ちになっているし、上述の IO_Bit や php-reader では read メソッドの末尾に LE/BE という suffix があり、呼び出し毎に利用者が指定するようになっている。

せっかく LE/BE があるのはありがたいとは思うけど、逆にストリームの中で頻繁にエンディアンが変わる場合があるのかも気になる。コンストラクタでデフォルトのエンディアンを指定しておけばいいのではないかと感じる。