SlideShare a Scribd company logo
1 of 53
PHPでバイナリ変換
        プログラミング
〜 前提知識から 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

What's hot

ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)A AOKI
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?増田 亨
 
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だモデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だIwao Harada
 
名は体を表していますか
名は体を表していますか名は体を表していますか
名は体を表していますかinfinite_loop
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]Koichiro Matsuoka
 
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話natsumi_ishizaka
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてYoshifumi Kawai
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術Unity Technologies Japan K.K.
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要Akira Inoue
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルYuta Hiroto
 
設計してますか?
設計してますか?設計してますか?
設計してますか?ke-m kamekoopa
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャtorisoup
 
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計コンポーネント指向と余白の設計
コンポーネント指向と余白の設計Manabu Yasuda
 

What's hot (20)

ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だモデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だ
 
名は体を表していますか
名は体を表していますか名は体を表していますか
名は体を表していますか
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
 
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話
 
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴についてHttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
 
設計してますか?
設計してますか?設計してますか?
設計してますか?
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
 

Viewers also liked

gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectSadayuki Furuhashi
 
PHP AV BINDING
PHP AV BINDINGPHP AV BINDING
PHP AV BINDINGYo Ya
 
Imagemagickknowhow
ImagemagickknowhowImagemagickknowhow
ImagemagickknowhowYo Ya
 
GoImagickThumbnail
GoImagickThumbnailGoImagickThumbnail
GoImagickThumbnailYo Ya
 
PHPでのSWF編集とその応用
PHPでのSWF編集とその応用PHPでのSWF編集とその応用
PHPでのSWF編集とその応用Yo Ya
 
php5-gd で画像を弄る話
php5-gd で画像を弄る話php5-gd で画像を弄る話
php5-gd で画像を弄る話Yo Ya
 
TwitterImgUpload
TwitterImgUploadTwitterImgUpload
TwitterImgUploadYo Ya
 
wildimagebinary
wildimagebinarywildimagebinary
wildimagebinaryYo Ya
 
退職PDFメーカーの作り方
退職PDFメーカーの作り方退職PDFメーカーの作り方
退職PDFメーカーの作り方Yo Ya
 
コンピュータ画像うんちく
コンピュータ画像うんちくコンピュータ画像うんちく
コンピュータ画像うんちくYo Ya
 
chokaizomae
chokaizomaechokaizomae
chokaizomaeYo Ya
 
How to read SWF
How to read SWFHow to read SWF
How to read SWFYo Ya
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境Yo Ya
 
goimagick-syokai-II
goimagick-syokai-IIgoimagick-syokai-II
goimagick-syokai-IIYo Ya
 
go-thumber-imagick
go-thumber-imagickgo-thumber-imagick
go-thumber-imagickYo Ya
 

Viewers also liked (16)

gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
 
PHP AV BINDING
PHP AV BINDINGPHP AV BINDING
PHP AV BINDING
 
Imagemagickknowhow
ImagemagickknowhowImagemagickknowhow
Imagemagickknowhow
 
GoImagickThumbnail
GoImagickThumbnailGoImagickThumbnail
GoImagickThumbnail
 
PHPでのSWF編集とその応用
PHPでのSWF編集とその応用PHPでのSWF編集とその応用
PHPでのSWF編集とその応用
 
php5-gd で画像を弄る話
php5-gd で画像を弄る話php5-gd で画像を弄る話
php5-gd で画像を弄る話
 
TwitterImgUpload
TwitterImgUploadTwitterImgUpload
TwitterImgUpload
 
wildimagebinary
wildimagebinarywildimagebinary
wildimagebinary
 
退職PDFメーカーの作り方
退職PDFメーカーの作り方退職PDFメーカーの作り方
退職PDFメーカーの作り方
 
コンピュータ画像うんちく
コンピュータ画像うんちくコンピュータ画像うんちく
コンピュータ画像うんちく
 
chokaizomae
chokaizomaechokaizomae
chokaizomae
 
How to read SWF
How to read SWFHow to read SWF
How to read SWF
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
 
Fbx解説 (1 構文編) (1)
Fbx解説 (1  構文編) (1)Fbx解説 (1  構文編) (1)
Fbx解説 (1 構文編) (1)
 
goimagick-syokai-II
goimagick-syokai-IIgoimagick-syokai-II
goimagick-syokai-II
 
go-thumber-imagick
go-thumber-imagickgo-thumber-imagick
go-thumber-imagick
 

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

Javaセキュアコーディングセミナー東京第2回講義
Javaセキュアコーディングセミナー東京第2回講義Javaセキュアコーディングセミナー東京第2回講義
Javaセキュアコーディングセミナー東京第2回講義JPCERT Coordination Center
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
Tora pointer3
Tora pointer3Tora pointer3
Tora pointer3MARISHI
 
Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1ryos36
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Tetsuya Yoshida
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成眞樹 冨澤
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
Unicodeについて教えてgooでしつこくきいてみたよ♪
Unicodeについて教えてgooでしつこくきいてみたよ♪Unicodeについて教えてgooでしつこくきいてみたよ♪
Unicodeについて教えてgooでしつこくきいてみたよ♪1000 VICKY
 
Deflate
DeflateDeflate
Deflate7shi
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3kAtsuo Ishimoto
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章Hiroki Mizukami
 
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707swkagami
 
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習Preferred Networks
 

Similar to PHP でバイナリ変換プログラミング (20)

計算機理論入門03
計算機理論入門03計算機理論入門03
計算機理論入門03
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Javaセキュアコーディングセミナー東京第2回講義
Javaセキュアコーディングセミナー東京第2回講義Javaセキュアコーディングセミナー東京第2回講義
Javaセキュアコーディングセミナー東京第2回講義
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Tora pointer3
Tora pointer3Tora pointer3
Tora pointer3
 
Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
5 Info Theory
5 Info Theory5 Info Theory
5 Info Theory
 
Unicodeについて教えてgooでしつこくきいてみたよ♪
Unicodeについて教えてgooでしつこくきいてみたよ♪Unicodeについて教えてgooでしつこくきいてみたよ♪
Unicodeについて教えてgooでしつこくきいてみたよ♪
 
Deflate
DeflateDeflate
Deflate
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3k
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
 
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707
 
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
 

Recently uploaded

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Recently uploaded (7)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

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

  • 1. PHPでバイナリ変換 プログラミング 〜 前提知識から 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) みたいには仕 様が公開されていないので、調べていません。