PHPでバイナリ変換        プログラミング〜 前提知識から openpear/IO_Bit の紹介、応用事例まで 〜                          “よや” <yoya@awm.jp>
自己紹介 六本木の方で携帯Webの仕事をしてます バイナリ変換プログラミングが趣味です             1101   1101
発表題目 (pure) PHP でバイナリ変換プログラミング  ここで云う pure は PHP の標準関数だけでという意味です  資料は公開してるので、この場で分からなくなくても大丈   夫です    http://d.hatena....
対象者 Web開発に飽きてきた人向け 2進数を知っている。指を使ってよいので2進を16進に変換で  きる バイト(Byte)とかビット(Bit)という言葉を聞いたことがある PHP には(実は)型があって string, integer...
発表内容 バイナリについて ビット(Bit)とバイト(Byte)について PHP でバイト(Byte)処理 PHP でビット(Bit)処理 openpear/IO_Bit パッケージの紹介 IO_Bit の応用事例 (IO_SWF,...
バイナリについておさらい バイナリって何?  本来は、コンピュータが処理し易い 0,1 の2進値データ  世間的には、テキスト以外のデータ (狭義のバイナリ)    エディタで開いて文字化けするデータ GIFファイル   (php.gif)
バイナリとテキスト 1バイトで0~255の値を表現できるけど、テキストはそ の一部しか使わない。(日本語の話は棚に置きます)    0~0x19   0x20~0xf9   0x80~0xff                         ...
バイナリの実例 バイナリの種類   マルチメディア系ファイル (JPEG, PNG, MPEG, AVI…)   実行ファイル (exe, a.out, jar, …)    (↑最近はバイナリというとこれを差す事が多い)   ネットワ...
バイナリ処理の目的 Web サービスではテキスト以外に画像/動画データや、 場合によると生の通信データを扱う事がある それらのデータを独自に変換する事で  より多くの種類のクライアント端末でサービスが受けられ  たり  通信データ量を減...
ビット(Bit)とバイト(Byte) コンピュータの処理(入出力や編集等)する単位 バイナリ処理はこれらの単位でデータを操作する                           バイト列             43 57 53 06 ...
ビット(Bit) (おさらい) ビット(Bit)について  0と1を用いて2通りの状態を表現したもの  ビットを並べると4通り8通りと表現の幅が広がる      0, 1               00, 01, 10,11      ...
バイト(Byte) (おさらい) バイト(Byte)とは  本来は、(欧米の)1文字を表すのに必要なビットの集まり  狭義にはビットを8つまとめた単位  16進数で表現する事が多い (バイナリエディタの表示)             0...
バイナリエディタを使う バイナリエディタ諸々  Macintosh なら 0xED、Windows なら Stirling, Bz Editor 手動で弄るのが面倒になったら PHP の出番です。
ここから本題
PHP とバイナリと String型 PHP の String 型でバイナリ処理が出来る  PHP は String 型に対し文字としての特別な事をしない        PHP における文字列型は、バイトの配列と整数値        (バッ...
String 型でバイト処理 ファイル入出力 ファイル       file_get_contents          file_put_contents       ファイル                   input        ...
String 型でバイト処理 ord,chr バイナリと整数値との相互変換                (string)   $b = ord($a)   (integer or float)              バイナリ      ...
String 型でバイト処理 Endian 2バイト以上のバイナリと整数値の相互変換  Big Endian (MSB First)                バイナリ                          整数値     ...
String 型でバイト処理 BigEndian バイナリと整数値の相互変換 (Big Endian)          $b = unpack(‘n’, $a)        $b = unpack(‘N’, $a)  バイナリ      ...
String 型でバイト処理 LittleEndian バイナリと整数値の相互変換 (Little Endian)       $b = unpack(‘v’, $a)        $b = unpack(‘V’, $a)   バイナリ  ...
String 型でバイト処理 その他 strrev で前後リバース(逆順にする) substr_replace で一部入れ替え strcmp でバイナリ比較(一致するか否か) str_pad で同じバイトの繰り返し その他、str 系...
バイト処理の注意点 $a[0]   文字列を配列のように参照すると、($a の 0 番目の数値でなく)、     0番目の文字を切り出したものが取得できる。   $a[0] は substr($a, 0, 1) と同じ (C言語出身者は多...
バイト処理の実例 JPEG分解 例えば) JPEG 画像のサイズを抜き出す  http://www.w3.org/Graphics/JPEG/ ← 仕様はココ                              height     ...
バイト処理の実例 JPEG形式 JPEG chunk data format (以下の3パターン)                               FF?? &                                   ...
バイト処理の実例 JPEGサイズ Code Sample これで、 width, height が抽出できる
バイト処理の実例 GIF, PNG (簡単) ついでに    GIF                           witdh   height           6 bytes GIF の 画像サイズ          PNG ...
(Windows で PHP build) ネットワークが繋がらないので php.ext で動作デモ 最近は、IDE を操作せずに CLI だけで build 出来ます。  http://wiki.php.net/internals/wi...
JPEG/GIF/PNG サイズの実験デモ 端末上で動作デモ
ここからビットの話
PHP でビット処理 PHP にはビットを切り出すユーティリティはない  BitStream とか BitBuffer とかそういう感じの  ビット演算は出来るので、それで何とかする
ビット演算 ビット演算(積とシフト)を使ったビット取り出し処理1Byte 0 0 0 0 0 0 0 0 $a   1 111 11 1 1                & (1 << 3) 0 0 0 0 1 0 0 0         ...
PHP でビット読み出し (Read) 頭から1Bit 毎に読み出し            0 000 00 0 0    1Byte            1 111 11 1 1                 &            ...
PHP でビット書き込み (Write) Bit を連結して Byte を生成 1Byte   0 000 00 0 0               0 0  $a     1 111 11 1 1                   0 0...
IO_Bit の紹介 Openpear ~ IO_Bit   http://openpear.org/package/IO_Bit          ビット処理のユーティリティです。いちい          ち、pack v したり、inc...
IO_Bit の使い方 バイト入出力 ビット入出力
IO_Bit の応用例 openpear/IO_SWF (この後で説明)   Flash の実行ファイル(SWF)を編集 openpear/IO_Zlib (時間があったら説明)   Zlib 圧縮されたデータを伸長する
IO_SWF の紹介 Openpear ~ IO_SWF   http://openpear.org/package/IO_SWF SWF バイナリを解釈/編集する為のライブラリです。 IO_Bit が必要で す。主に Flash Lite...
SWF のバイナリ構造 (ヘッダ) ビット処理が必要  http://labs.gree.jp/blog/2010/08/631/ から抜粋                                          ビット     ...
SWF のバイナリ構造 (タグ) Short Tag と Long Tag                         ビット                         単位
IO_Bit で SWF を解釈 (ヘッダ) IO/SWF.php から抜粋 (バイト処理)
IO_Bit で SWF を解釈 (RECT) IO/SWF/Type/RECT.php から引用 (ビット処理)
IO_SWF の使い方 使い方                                 インスタンス生成                                バイナリ読み込み          何らかの編集するメソッドを呼ぶ...
IO_SWF の利用例 SWF ファイルの解析 SWF 内コンテンツの入れ替え                入れ替え後の   バイナリ出力
IO_SWF の実験デモ 端末上で動作デモ
IO_Zlib の紹介 Openpear ~ IO_Zlib   http://openpear.org/package/IO_Zlib          Zlib フォーマットの分解ルーチンです。          Inflate(伸張)...
Zlib って何? データ圧縮アルゴリズムに Deflate というモノがあり、 そのコンテナ形式  Deflate の入れ物として有名なものに Gzip と Zlib がある  詳しくはここにリンクまとめ      → http://...
Zlib について ハフマン符号と LZ77 を組み合わせた圧縮。   ハフマン符号は符号の出現頻度に応じて、頻出する符号に    短いビット列、稀な符号に長いビット列を割り当てる事で    データ量を減らす手法   LZ77 は同じパタ...
IO_Zlib の使い方 使い方                 インスタンス生成                   圧縮データ読み込み        何らかの編集するメソッドを呼ぶ                伸長結果のデータを出力  ...
IO_Zlib の動作デモ 端末で動作デモ
エクスキューズ 実は SWFEditor というPHP拡張で同じ事出来ます。  http://sourceforge.jp/projects/swfed/  実サービスで使うならこっちです。 実は標準関数に gzuncompress が...
要望 他の言語で、これに似た発表があれば教えて下さい。
質問 getimagesize の方がよくないですか?   普通はそっちを使いますが、getimagesize はサイズ以外の余計な     物も返すので、自前で処理した方が軽いかもしれない。 拡張子でファイルの中身を判断するだけでなく、...
以上 ご清聴ありがとうございました
Upcoming SlideShare
Loading in...5
×

PHP でバイナリ変換プログラミング

14,917
-1

Published on

バイナリ処理の前提知識から openpear/IO_Bit の紹介、応用事例まで

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
14,917
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
21
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

PHP でバイナリ変換プログラミング

  1. 1. PHPでバイナリ変換 プログラミング〜 前提知識から openpear/IO_Bit の紹介、応用事例まで 〜 “よや” <yoya@awm.jp>
  2. 2. 自己紹介 六本木の方で携帯Webの仕事をしてます バイナリ変換プログラミングが趣味です 1101 1101
  3. 3. 発表題目 (pure) PHP でバイナリ変換プログラミング  ここで云う pure は PHP の標準関数だけでという意味です  資料は公開してるので、この場で分からなくなくても大丈 夫です  http://d.hatena.ne.jp/yoya/20111112/php
  4. 4. 対象者 Web開発に飽きてきた人向け 2進数を知っている。指を使ってよいので2進を16進に変換で きる バイト(Byte)とかビット(Bit)という言葉を聞いたことがある PHP には(実は)型があって string, integer, flort で処理が違うと いう話を何処かで聞いたことがある
  5. 5. 発表内容 バイナリについて ビット(Bit)とバイト(Byte)について PHP でバイト(Byte)処理 PHP でビット(Bit)処理 openpear/IO_Bit パッケージの紹介 IO_Bit の応用事例 (IO_SWF, IO_Zlib)
  6. 6. バイナリについておさらい バイナリって何?  本来は、コンピュータが処理し易い 0,1 の2進値データ  世間的には、テキスト以外のデータ (狭義のバイナリ)  エディタで開いて文字化けするデータ GIFファイル (php.gif)
  7. 7. バイナリとテキスト 1バイトで0~255の値を表現できるけど、テキストはそ の一部しか使わない。(日本語の話は棚に置きます) 0~0x19 0x20~0xf9 0x80~0xff この辺りの !”#… 値が化けて ABC… 表示される 012… abc… バイナリの方がより多くの情報を詰められる
  8. 8. バイナリの実例 バイナリの種類  マルチメディア系ファイル (JPEG, PNG, MPEG, AVI…)  実行ファイル (exe, a.out, jar, …) (↑最近はバイナリというとこれを差す事が多い)  ネットワーク上の通信データ (TCP, ISDN, …)  暗号化されたデータ (zip, gzip, …) 色々ありますネ!
  9. 9. バイナリ処理の目的 Web サービスではテキスト以外に画像/動画データや、 場合によると生の通信データを扱う事がある それらのデータを独自に変換する事で  より多くの種類のクライアント端末でサービスが受けられ たり  通信データ量を減らせたり エディタで開いて読めないから諦める。だと勿体ない
  10. 10. ビット(Bit)とバイト(Byte) コンピュータの処理(入出力や編集等)する単位 バイナリ処理はこれらの単位でデータを操作する バイト列 43 57 53 06 00 48 2c 00 78 9c b9 6bバイナリ バイナリ ビット列 00100011 01010111
  11. 11. ビット(Bit) (おさらい) ビット(Bit)について  0と1を用いて2通りの状態を表現したもの  ビットを並べると4通り8通りと表現の幅が広がる 0, 1 00, 01, 10,11 00 01 0 2通り 00 4通り 1 (0〜1) 11 (0〜3) 10 11 000, 001, 010, 011, 00000000, 00000001, 00000010, 00000011, … 100, 101, 110, 111 …, 11111101, 11111110, 11111111 000 8通り 0 000 00 0 0 256通り 111 (0〜7) 1 111 11 1 1 (0〜255)
  12. 12. バイト(Byte) (おさらい) バイト(Byte)とは  本来は、(欧米の)1文字を表すのに必要なビットの集まり  狭義にはビットを8つまとめた単位  16進数で表現する事が多い (バイナリエディタの表示) 0 000 00 0 0 これ丸毎で 1 111 11 1 1 1バイト 4Bit で 00 8Bit で 16進1文字 実例 (JPEG の頭) FF 16進2文字 FF D8 FF E0
  13. 13. バイナリエディタを使う バイナリエディタ諸々  Macintosh なら 0xED、Windows なら Stirling, Bz Editor 手動で弄るのが面倒になったら PHP の出番です。
  14. 14. ここから本題
  15. 15. PHP とバイナリと String型 PHP の String 型でバイナリ処理が出来る  PHP は String 型に対し文字としての特別な事をしない PHP における文字列型は、バイトの配列と整数値 (バッファ長) で実装されています。 バイト列を文 字列に変換する方法については何の情報も持って おらず、完全にプログラマ任せとなっています。  http://www.php.net/manual/ja/language.types.string.php#languag e.types.string.details  8bitスルー。 ¥0終端もない ← この辺りの心配は無用  つまり、バイト(Byte)単位の処理は PHP でも簡単
  16. 16. String 型でバイト処理 ファイル入出力 ファイル file_get_contents file_put_contents ファイル input output 連結と分解 $c = $a . $b $b = substr($a, $x, $y) 連結 分解 $a $a $b $x $y $c $b
  17. 17. String 型でバイト処理 ord,chr バイナリと整数値との相互変換 (string) $b = ord($a) (integer or float) バイナリ 整数値 $a $b 実行例 $a = chr($b)(分かりやすいように Y o テキストで) $a = ‘Yoya’; Y $b = 89; $c = 111; 実行結果 実行結果 $b = ord($a[0]); 89 $a = chr($b).chr($c); Yo echo $b; = (0x59) echo $a;
  18. 18. String 型でバイト処理 Endian 2バイト以上のバイナリと整数値の相互変換  Big Endian (MSB First) バイナリ 整数値 x y 0x12 0x34 (x*256)+y 0x1234 = 4660  Little Endian (LSB first) =0x100 バイナリ 整数値 x y 0x12 0x34 x+(256*y) 0x3412 = 13330
  19. 19. String 型でバイト処理 BigEndian バイナリと整数値の相互変換 (Big Endian) $b = unpack(‘n’, $a) $b = unpack(‘N’, $a) バイナリ 整数値 バイナリ 整数値 $a x y $b[1] $a w x y z $b[1] (x*256)+y (((((w*256)+x)*256)+y)*256)+z pack で逆変換
  20. 20. String 型でバイト処理 LittleEndian バイナリと整数値の相互変換 (Little Endian) $b = unpack(‘v’, $a) $b = unpack(‘V’, $a) バイナリ 整数値 バイナリ 整数値 $a x y $b[1] $a w x y z $b[1] x+(y*256) w+(256*(x+(256*(y+(256*z))))) pack で逆変換
  21. 21. String 型でバイト処理 その他 strrev で前後リバース(逆順にする) substr_replace で一部入れ替え strcmp でバイナリ比較(一致するか否か) str_pad で同じバイトの繰り返し その他、str 系で色々な操作が可能。  (あくまで、Byteレベルで)
  22. 22. バイト処理の注意点 $a[0]  文字列を配列のように参照すると、($a の 0 番目の数値でなく)、 0番目の文字を切り出したものが取得できる。  $a[0] は substr($a, 0, 1) と同じ (C言語出身者は多分ココで躓く) unpack(‘N’, … と ‘V’の PHP bug  N, V は unsigned long (32ビット値)のはずだが、実際は signed long(符号付き)の値が出てくる  負の値が出てきたら 4294967296 を足して補正  足すと (integer の範囲を超えて)型が float になる。要注意。  pack は正でも負でも受理してくれる。
  23. 23. バイト処理の実例 JPEG分解 例えば) JPEG 画像のサイズを抜き出す  http://www.w3.org/Graphics/JPEG/ ← 仕様はココ height width ここにサイズ が入っている JPEG 情報要素 JPEG SOI APP1 DQT SOF0 DHT SOS RST EOI
  24. 24. バイト処理の実例 JPEG形式 JPEG chunk data format (以下の3パターン) FF?? & ! FF00 SOI,EOI APP,DQT, SOF0 RSTx Marker Marker Length Data Marker Data Marker 2 bytes 2 bytes 2 bytes Length 2 bytes 次のchunkまでscan SOF0 の中身 SOF0 Data Marker Length P height width =0xffc0 2 bytes 2 bytes 1 byte 2 byte 2 byte
  25. 25. バイト処理の実例 JPEGサイズ Code Sample これで、 width, height が抽出できる
  26. 26. バイト処理の実例 GIF, PNG (簡単) ついでに GIF witdh height 6 bytes GIF の 画像サイズ PNG PNG の witdh height 16 bytes 画像サイズ
  27. 27. (Windows で PHP build) ネットワークが繋がらないので php.ext で動作デモ 最近は、IDE を操作せずに CLI だけで build 出来ます。  http://wiki.php.net/internals/windows/stepbystepbuild  必要なファイルを揃えた後は、3つのコマンドだけ buildconf configure nmake
  28. 28. JPEG/GIF/PNG サイズの実験デモ 端末上で動作デモ
  29. 29. ここからビットの話
  30. 30. PHP でビット処理 PHP にはビットを切り出すユーティリティはない  BitStream とか BitBuffer とかそういう感じの  ビット演算は出来るので、それで何とかする
  31. 31. ビット演算 ビット演算(積とシフト)を使ったビット取り出し処理1Byte 0 0 0 0 0 0 0 0 $a 1 111 11 1 1 & (1 << 3) 0 0 0 0 1 0 0 0 3つ 0 $b 0 000 000 3 を一般化して 1 3つ $n に 1 Bit 0 $c 1
  32. 32. PHP でビット読み出し (Read) 頭から1Bit 毎に読み出し 0 000 00 0 0 1Byte 1 111 11 1 1 & 0 0 000 0 0 0 11 1 シフト 1Bit 0 0 0 0 x8 1 1 0 0 1 1 0 0 1 1 1 1
  33. 33. PHP でビット書き込み (Write) Bit を連結して Byte を生成 1Byte 0 000 00 0 0 0 0 $a 1 111 11 1 1 0 0 1Bit 1 1 0 0 1 1 0 0 | ← ビット和演算子 x 8 1 1 1 1 (1 << 3) 0 0 0 0 1 0 0 0 | ← ビット和 3つ 0 0 000 0 0 0 0 000 10 0 0 11 1 シフト 1 111 11 1 1 0 000 00 0 0 1Byte 1 111 11 1 1
  34. 34. IO_Bit の紹介 Openpear ~ IO_Bit  http://openpear.org/package/IO_Bit ビット処理のユーティリティです。いちい ち、pack v したり、incremental に offset を 処理するのが面倒だという人向けです。利 用に制限はかけません。コピーも改変もご 自由にどうぞ。MIT ライセンスにしまし た。  http://pwiki.awm.jp/~yoya/?IO_Bit
  35. 35. IO_Bit の使い方 バイト入出力 ビット入出力
  36. 36. IO_Bit の応用例 openpear/IO_SWF (この後で説明)  Flash の実行ファイル(SWF)を編集 openpear/IO_Zlib (時間があったら説明)  Zlib 圧縮されたデータを伸長する
  37. 37. IO_SWF の紹介 Openpear ~ IO_SWF  http://openpear.org/package/IO_SWF SWF バイナリを解釈/編集する為のライブラリです。 IO_Bit が必要で す。主に Flash Lite 1.x/2.x を対象にしています。利用に制限はかけま せん。コピーも改変もご自由にどうぞ。MIT ライセンスにしました。 IO_SWF
  38. 38. SWF のバイナリ構造 (ヘッダ) ビット処理が必要  http://labs.gree.jp/blog/2010/08/631/ から抜粋 ビット 単位
  39. 39. SWF のバイナリ構造 (タグ) Short Tag と Long Tag ビット 単位
  40. 40. IO_Bit で SWF を解釈 (ヘッダ) IO/SWF.php から抜粋 (バイト処理)
  41. 41. IO_Bit で SWF を解釈 (RECT) IO/SWF/Type/RECT.php から引用 (ビット処理)
  42. 42. IO_SWF の使い方 使い方 インスタンス生成 バイナリ読み込み 何らかの編集するメソッドを呼ぶ 編集結果の バイナリを出 力  http://pwiki.awm.jp/~yoya/?IO_SWF
  43. 43. IO_SWF の利用例 SWF ファイルの解析 SWF 内コンテンツの入れ替え 入れ替え後の バイナリ出力
  44. 44. IO_SWF の実験デモ 端末上で動作デモ
  45. 45. IO_Zlib の紹介 Openpear ~ IO_Zlib  http://openpear.org/package/IO_Zlib Zlib フォーマットの分解ルーチンです。 Inflate(伸張)は動作しますが、deflate(圧縮) は btype:0 (=無圧縮)のみ対応します。
  46. 46. Zlib って何? データ圧縮アルゴリズムに Deflate というモノがあり、 そのコンテナ形式  Deflate の入れ物として有名なものに Gzip と Zlib がある  詳しくはここにリンクまとめ  → http://pwiki.awm.jp/~yoya/?Deflate Gzip は gzip コマンドで生成されるファイル形式 Gzip はファイル名やタイムスタンプが入れられるが、 純粋に圧縮したい場合は、より簡略な Zlib 形式が用いら れる。
  47. 47. Zlib について ハフマン符号と LZ77 を組み合わせた圧縮。  ハフマン符号は符号の出現頻度に応じて、頻出する符号に 短いビット列、稀な符号に長いビット列を割り当てる事で データ量を減らす手法  LZ77 は同じパターンがある時にはその繰り返しの長さを指 定する事で、データ量を減らす手法  真面目に話すと丸一日かかるので、説明はココまで。 ハフマン符号はビット単位の処理が必要な符号化方式 IO_Bit の出番!
  48. 48. IO_Zlib の使い方 使い方 インスタンス生成 圧縮データ読み込み 何らかの編集するメソッドを呼ぶ 伸長結果のデータを出力 フォーマット解析用
  49. 49. IO_Zlib の動作デモ 端末で動作デモ
  50. 50. エクスキューズ 実は SWFEditor というPHP拡張で同じ事出来ます。  http://sourceforge.jp/projects/swfed/  実サービスで使うならこっちです。 実は標準関数に gzuncompress があります。  http://php.net/manual/ja/function.gzuncompress.php  IO_Zlib は実装サンプル、又はフォーマットの解析用で。。
  51. 51. 要望 他の言語で、これに似た発表があれば教えて下さい。
  52. 52. 質問 getimagesize の方がよくないですか?  普通はそっちを使いますが、getimagesize はサイズ以外の余計な 物も返すので、自前で処理した方が軽いかもしれない。 拡張子でファイルの中身を判断するだけでなく、頭のバ イナリってみたりします?  magick (/usr/share/mime/magick 等)ファイルを見ると、典型的な ファイル形式の頭4バイトが列挙されてて便利です。 ZIP パスワードの入力を自動化できません?  Deflate(RFC1951),Zlib(RFC1950), Gzip(RFC1952) みたいには仕 様が公開されていないので、調べていません。
  53. 53. 以上 ご清聴ありがとうございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×