狠狠撸

狠狠撸Share a Scribd company logo
笔贬笔でバイナリ変换
        プログラミング
? 前提知識から openpear/IO_Bit の紹介、応用事例まで ?
                          “よや” <yoya@awm.jp>
自己紹介

? 六本木の方で携帯Webの仕事をしてます




? バイナリ変換プログラミングが趣味です

             1101   1101
発表題目

? (pure) PHP でバイナリ変換プログラミング
 ? ここで云う pure は PHP の標準関数だけでという意味です




 ? 資料は公開してるので、この場で分からなくなくても大丈
   夫です
   ? http://d.hatena.ne.jp/yoya/20111112/php
対象者
? Web開発に飽きてきた人向け

? 2進数を知っている。指を使ってよいので2進を16進に変換で
  きる



? バイト(Byte)とかビット(Bit)という言葉を聞いたことがある

? PHP には(実は)型があって string, integer, flort で処理が違うと
  いう話を何処かで聞いたことがある
発表内容

? バイナリについて

? ビット(Bit)とバイト(Byte)について

? PHP でバイト(Byte)処理

? PHP でビット(Bit)処理

? openpear/IO_Bit パッケージの紹介

? IO_Bit の応用事例 (IO_SWF, IO_Zlib)
バイナリについておさらい

? バイナリって何?
 ? 本来は、コンピュータが処理し易い 0,1 の2進値データ
 ? 世間的には、テキスト以外のデータ (狭義のバイナリ)
   ? エディタで開いて文字化けするデータ




 GIFファイル
   (php.gif)
バイナリとテキスト

? 1バイトで0~255の値を表現できるけど、テキストはそ
 の一部しか使わない。(日本語の話は棚に置きます)
    0~0x19   0x20~0xf9   0x80~0xff


                                     この辺りの
             !”#…
                                     値が化けて
             ABC…
                                     表示される
             012…
             abc…



? バイナリの方がより多くの情報を詰められる
バイナリの実例
? バイナリの種類
  ? マルチメディア系ファイル (JPEG, PNG, MPEG, AVI…)


  ? 実行ファイル (exe, a.out, jar, …)
    (↑最近はバイナリというとこれを差す事が多い)

  ? ネットワーク上の通信データ (TCP, ISDN, …)


  ? 暗号化されたデータ (zip, gzip, …)

                                  色々ありますネ!
バイナリ処理の目的

? Web サービスではテキスト以外に画像/動画データや、
 場合によると生の通信データを扱う事がある

? それらのデータを独自に変換する事で
 ? より多くの種類のクライアント端末でサービスが受けられ
  たり

 ? 通信データ量を減らせたり



? エディタで開いて読めないから諦める。だと勿体ない
ビット(Bit)とバイト(Byte)

? コンピュータの処理(入出力や編集等)する単位

? バイナリ処理はこれらの単位でデータを操作する

                           バイト列

             43 57 53 06 00 48
             2c 00 78 9c b9 6b


バイナリ                               バイナリ
                            ビット列
       00100011 01010111
ビット(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)
バイト(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
バイナリエディタを使う

? バイナリエディタ諸々
 ? Macintosh なら 0xED、Windows なら Stirling, Bz Editor




? 手動で弄るのが面倒になったら PHP の出番です。
ここから本题
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 でも簡単
String 型でバイト処理

? ファイル入出力
 ファイル       file_get_contents          file_put_contents       ファイル



                   input                         output

? 連結と分解

      $c = $a . $b                   $b = substr($a, $x, $y)

 連結                             分解
                                       $a
      $a      $b                            $x    $y


       $c                                   $b
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;
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
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 で逆変換
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 で逆変換
String 型でバイト処理 その他

? strrev で前後リバース(逆順にする)

? substr_replace で一部入れ替え

? strcmp でバイナリ比較(一致するか否か)

? str_pad で同じバイトの繰り返し

? その他、str 系で色々な操作が可能。
  ? (あくまで、Byteレベルで)
バイト処理の注意点
? $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 は正でも負でも受理してくれる。
バイト処理の実例 JPEG分解

? 例えば) JPEG 画像のサイズを抜き出す
 ? http://www.w3.org/Graphics/JPEG/ ← 仕様はココ



                              height


                     width                    ここにサイズ
                                              が入っている
? JPEG 情報要素

      JPEG
        SOI   APP1      DQT   SOF0     DHT   SOS   RST   EOI
バイト処理の実例 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
バイト処理の実例 JPEGサイズ

? Code

 Sample



? これで、

 width, height

 が抽出できる
バイト処理の実例 GIF, PNG (簡単)

? ついでに    GIF
                           witdh   height
           6 bytes
? GIF の

 画像サイズ


          PNG
? PNG の                            witdh    height
                16 bytes
 画像サイズ
(Windows で PHP build)

? ネットワークが繋がらないので php.ext で動作デモ

? 最近は、IDE を操作せずに CLI だけで build 出来ます。
 ? http://wiki.php.net/internals/windows/stepbystepbuild
 ? 必要なファイルを揃えた後は、3つのコマンドだけ



                  buildconf
                  configure
                  nmake
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

                       3つ

                  0
   $b     0 000       000   3 を一般化して
                  1
                      3つ        $n に

  1 Bit                 0
   $c                   1
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
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
IO_Bit の紹介

? Openpear ~ IO_Bit


  ? http://openpear.org/package/IO_Bit

          ビット処理のユーティリティです。いちい
          ち、pack v したり、incremental に offset を
          処理するのが面倒だという人向けです。利
          用に制限はかけません。コピーも改変もご
          自由にどうぞ。MIT ライセンスにしまし
          た。
  ? http://pwiki.awm.jp/~yoya/?IO_Bit
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 1.x/2.x を対象にしています。利用に制限はかけま
 せん。コピーも改変もご自由にどうぞ。MIT ライセンスにしました。



                                 IO_SWF
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 の使い方

? 使い方


                                 インスタンス生成

                                バイナリ読み込み

          何らかの編集するメソッドを呼ぶ

                          編集結果の        バイナリを出
         力


 ? http://pwiki.awm.jp/~yoya/?IO_SWF
IO_SWF の利用例

? SWF ファイルの解析




? SWF 内コンテンツの入れ替え




                入れ替え後の   バイナリ出力
IO_SWF の実験デモ

? 端末上で動作デモ
IO_Zlib の紹介

? Openpear ~ IO_Zlib


  ? http://openpear.org/package/IO_Zlib


          Zlib フォーマットの分解ルーチンです。
          Inflate(伸張)は動作しますが、deflate(圧縮)
          は btype:0 (=無圧縮)のみ対応します。
Zlib って何?

? データ圧縮アルゴリズムに Deflate というモノがあり、
 そのコンテナ形式
 ? Deflate の入れ物として有名なものに Gzip と Zlib がある
 ? 詳しくはここにリンクまとめ
   ?   → http://pwiki.awm.jp/~yoya/?Deflate

? Gzip は gzip コマンドで生成されるファイル形式

? Gzip はファイル名やタイムスタンプが入れられるが、
 純粋に圧縮したい場合は、より簡略な Zlib 形式が用いら
 れる。
Zlib について

? ハフマン符号と LZ77 を組み合わせた圧縮。
  ? ハフマン符号は符号の出現頻度に応じて、頻出する符号に
    短いビット列、稀な符号に長いビット列を割り当てる事で
    データ量を減らす手法
  ? LZ77 は同じパターンがある時にはその繰り返しの長さを指
    定する事で、データ量を減らす手法
  ? 真面目に話すと丸一日かかるので、説明はココまで。

? ハフマン符号はビット単位の処理が必要な符号化方式

? IO_Bit の出番!
IO_Zlib の使い方

? 使い方


                 インスタンス生成

                   圧縮データ読み込み

        何らかの編集するメソッドを呼ぶ

                伸長結果のデータを出力
               フォーマット解析用
IO_Zlib の動作デモ

? 端末で動作デモ
エクスキューズ

? 実は SWFEditor というPHP拡張で同じ事出来ます。
 ? http://sourceforge.jp/projects/swfed/


 ? 実サービスで使うならこっちです。



? 実は標準関数に gzuncompress があります。
 ? http://php.net/manual/ja/function.gzuncompress.php


 ? IO_Zlib は実装サンプル、又はフォーマットの解析用で。。
要望




? 他の言語で、これに似た発表があれば教えて下さい。
質問
? getimagesize の方がよくないですか?

  ? 普通はそっちを使いますが、getimagesize はサイズ以外の余計な
     物も返すので、自前で処理した方が軽いかもしれない。

? 拡張子でファイルの中身を判断するだけでなく、頭のバ
  イナリってみたりします?
  ? magick (/usr/share/mime/magick 等)ファイルを見ると、典型的な
     ファイル形式の頭4バイトが列挙されてて便利です。

? ZIP パスワードの入力を自動化できません?
  ? Deflate(RFC1951),Zlib(RFC1950), Gzip(RFC1952) みたいには仕
     様が公開されていないので、調べていません。
以上




? ご清聴ありがとうございました

More Related Content

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

  • 1. 笔贬笔でバイナリ変换 プログラミング ? 前提知識から openpear/IO_Bit の紹介、応用事例まで ? “よや” <yoya@awm.jp>
  • 3. 発表題目 ? (pure) PHP でバイナリ変換プログラミング ? ここで云う pure は PHP の標準関数だけでという意味です ? 資料は公開してるので、この場で分からなくなくても大丈 夫です ? http://d.hatena.ne.jp/yoya/20111112/php
  • 4. 対象者 ? Web開発に飽きてきた人向け ? 2進数を知っている。指を使ってよいので2進を16進に変換で きる ? バイト(Byte)とかビット(Bit)という言葉を聞いたことがある ? PHP には(実は)型があって string, integer, flort で処理が違うと いう話を何処かで聞いたことがある
  • 5. 発表内容 ? バイナリについて ? ビット(Bit)とバイト(Byte)について ? PHP でバイト(Byte)処理 ? PHP でビット(Bit)処理 ? openpear/IO_Bit パッケージの紹介 ? IO_Bit の応用事例 (IO_SWF, IO_Zlib)
  • 6. バイナリについておさらい ? バイナリって何? ? 本来は、コンピュータが処理し易い 0,1 の2進値データ ? 世間的には、テキスト以外のデータ (狭義のバイナリ) ? エディタで開いて文字化けするデータ GIFファイル (php.gif)
  • 7. バイナリとテキスト ? 1バイトで0~255の値を表現できるけど、テキストはそ の一部しか使わない。(日本語の話は棚に置きます) 0~0x19 0x20~0xf9 0x80~0xff この辺りの !”#… 値が化けて ABC… 表示される 012… abc… ? バイナリの方がより多くの情報を詰められる
  • 8. バイナリの実例 ? バイナリの種類 ? マルチメディア系ファイル (JPEG, PNG, MPEG, AVI…) ? 実行ファイル (exe, a.out, jar, …) (↑最近はバイナリというとこれを差す事が多い) ? ネットワーク上の通信データ (TCP, ISDN, …) ? 暗号化されたデータ (zip, gzip, …) 色々ありますネ!
  • 9. バイナリ処理の目的 ? Web サービスではテキスト以外に画像/動画データや、 場合によると生の通信データを扱う事がある ? それらのデータを独自に変換する事で ? より多くの種類のクライアント端末でサービスが受けられ たり ? 通信データ量を減らせたり ? エディタで開いて読めないから諦める。だと勿体ない
  • 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. バイト(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. バイナリエディタを使う ? バイナリエディタ諸々 ? Macintosh なら 0xED、Windows なら Stirling, Bz Editor ? 手動で弄るのが面倒になったら PHP の出番です。
  • 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. 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. 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. 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. 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. 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. String 型でバイト処理 その他 ? strrev で前後リバース(逆順にする) ? substr_replace で一部入れ替え ? strcmp でバイナリ比較(一致するか否か) ? str_pad で同じバイトの繰り返し ? その他、str 系で色々な操作が可能。 ? (あくまで、Byteレベルで)
  • 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. バイト処理の実例 JPEG分解 ? 例えば) JPEG 画像のサイズを抜き出す ? http://www.w3.org/Graphics/JPEG/ ← 仕様はココ height width ここにサイズ が入っている ? JPEG 情報要素 JPEG SOI APP1 DQT SOF0 DHT SOS RST EOI
  • 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. バイト処理の実例 JPEGサイズ ? Code Sample ? これで、 width, height が抽出できる
  • 26. バイト処理の実例 GIF, PNG (簡単) ? ついでに GIF witdh height 6 bytes ? GIF の 画像サイズ PNG ? PNG の witdh height 16 bytes 画像サイズ
  • 27. (Windows で PHP build) ? ネットワークが繋がらないので php.ext で動作デモ ? 最近は、IDE を操作せずに CLI だけで build 出来ます。 ? http://wiki.php.net/internals/windows/stepbystepbuild ? 必要なファイルを揃えた後は、3つのコマンドだけ buildconf configure nmake
  • 30. PHP でビット処理 ? PHP にはビットを切り出すユーティリティはない ? BitStream とか BitBuffer とかそういう感じの ? ビット演算は出来るので、それで何とかする
  • 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. 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. 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. IO_Bit の紹介 ? Openpear ~ IO_Bit ? http://openpear.org/package/IO_Bit ビット処理のユーティリティです。いちい ち、pack v したり、incremental に offset を 処理するのが面倒だという人向けです。利 用に制限はかけません。コピーも改変もご 自由にどうぞ。MIT ライセンスにしまし た。 ? http://pwiki.awm.jp/~yoya/?IO_Bit
  • 36. IO_Bit の応用例 ? openpear/IO_SWF (この後で説明) ? Flash の実行ファイル(SWF)を編集 ? openpear/IO_Zlib (時間があったら説明) ? Zlib 圧縮されたデータを伸長する
  • 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. SWF のバイナリ構造 (ヘッダ) ? ビット処理が必要 ? http://labs.gree.jp/blog/2010/08/631/ から抜粋 ビット 単位
  • 39. SWF のバイナリ構造 (タグ) ? Short Tag と Long Tag ビット 単位
  • 40. IO_Bit で SWF を解釈 (ヘッダ) ? IO/SWF.php から抜粋 (バイト処理)
  • 41. IO_Bit で SWF を解釈 (RECT) ? IO/SWF/Type/RECT.php から引用 (ビット処理)
  • 42. IO_SWF の使い方 ? 使い方 インスタンス生成 バイナリ読み込み 何らかの編集するメソッドを呼ぶ 編集結果の バイナリを出 力 ? http://pwiki.awm.jp/~yoya/?IO_SWF
  • 43. IO_SWF の利用例 ? SWF ファイルの解析 ? SWF 内コンテンツの入れ替え 入れ替え後の バイナリ出力
  • 45. IO_Zlib の紹介 ? Openpear ~ IO_Zlib ? http://openpear.org/package/IO_Zlib Zlib フォーマットの分解ルーチンです。 Inflate(伸張)は動作しますが、deflate(圧縮) は btype:0 (=無圧縮)のみ対応します。
  • 46. Zlib って何? ? データ圧縮アルゴリズムに Deflate というモノがあり、 そのコンテナ形式 ? Deflate の入れ物として有名なものに Gzip と Zlib がある ? 詳しくはここにリンクまとめ ? → http://pwiki.awm.jp/~yoya/?Deflate ? Gzip は gzip コマンドで生成されるファイル形式 ? Gzip はファイル名やタイムスタンプが入れられるが、 純粋に圧縮したい場合は、より簡略な Zlib 形式が用いら れる。
  • 47. Zlib について ? ハフマン符号と LZ77 を組み合わせた圧縮。 ? ハフマン符号は符号の出現頻度に応じて、頻出する符号に 短いビット列、稀な符号に長いビット列を割り当てる事で データ量を減らす手法 ? LZ77 は同じパターンがある時にはその繰り返しの長さを指 定する事で、データ量を減らす手法 ? 真面目に話すと丸一日かかるので、説明はココまで。 ? ハフマン符号はビット単位の処理が必要な符号化方式 ? IO_Bit の出番!
  • 48. IO_Zlib の使い方 ? 使い方 インスタンス生成 圧縮データ読み込み 何らかの編集するメソッドを呼ぶ 伸長結果のデータを出力 フォーマット解析用
  • 50. エクスキューズ ? 実は SWFEditor というPHP拡張で同じ事出来ます。 ? http://sourceforge.jp/projects/swfed/ ? 実サービスで使うならこっちです。 ? 実は標準関数に gzuncompress があります。 ? http://php.net/manual/ja/function.gzuncompress.php ? IO_Zlib は実装サンプル、又はフォーマットの解析用で。。
  • 52. 質問 ? getimagesize の方がよくないですか? ? 普通はそっちを使いますが、getimagesize はサイズ以外の余計な 物も返すので、自前で処理した方が軽いかもしれない。 ? 拡張子でファイルの中身を判断するだけでなく、頭のバ イナリってみたりします? ? magick (/usr/share/mime/magick 等)ファイルを見ると、典型的な ファイル形式の頭4バイトが列挙されてて便利です。 ? ZIP パスワードの入力を自動化できません? ? Deflate(RFC1951),Zlib(RFC1950), Gzip(RFC1952) みたいには仕 様が公開されていないので、調べていません。