狠狠撸
Submit Search
PHP でバイナリ変換プログラミング
?
Download as PPTX, PDF
?
12 likes
?
19,108 views
Yo Ya
Follow
バイナリ処理の前提知識から openpear/IO_Bit の紹介、応用事例まで
Read less
Read more
1 of 53
Download now
More Related Content
PHP でバイナリ変換プログラミング
1.
笔贬笔でバイナリ変换
プログラミング ? 前提知識から openpear/IO_Bit の紹介、応用事例まで ? “よや” <yoya@awm.jp>
2.
自己紹介 ? 六本木の方で携帯Webの仕事をしてます ? バイナリ変換プログラミングが趣味です
1101 1101
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 サービスではテキスト以外に画像/動画データや、
場合によると生の通信データを扱う事がある ? それらのデータを独自に変換する事で ? より多くの種類のクライアント端末でサービスが受けられ たり ? 通信データ量を減らせたり ? エディタで開いて読めないから諦める。だと勿体ない
10.
ビット(Bit)とバイト(Byte) ? コンピュータの処理(入出力や編集等)する単位 ? バイナリ処理はこれらの単位でデータを操作する
バイト列 43 57 53 06 00 48 2c 00 78 9c b9 6b バイナリ バイナリ ビット列 00100011 01010111
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 の出番です。
14.
ここから本题
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
28.
JPEG/GIF/PNG サイズの実験デモ ? 端末上で動作デモ
29.
ここからビットの话
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
35.
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 内コンテンツの入れ替え 入れ替え後の バイナリ出力
44.
IO_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 の使い方 ? 使い方
インスタンス生成 圧縮データ読み込み 何らかの編集するメソッドを呼ぶ 伸長結果のデータを出力 フォーマット解析用
49.
IO_Zlib の動作デモ ? 端末で動作デモ
50.
エクスキューズ ? 実は SWFEditor
というPHP拡張で同じ事出来ます。 ? http://sourceforge.jp/projects/swfed/ ? 実サービスで使うならこっちです。 ? 実は標準関数に gzuncompress があります。 ? http://php.net/manual/ja/function.gzuncompress.php ? IO_Zlib は実装サンプル、又はフォーマットの解析用で。。
51.
要望 ? 他の言語で、これに似た発表があれば教えて下さい。
52.
質問 ? getimagesize の方がよくないですか?
? 普通はそっちを使いますが、getimagesize はサイズ以外の余計な 物も返すので、自前で処理した方が軽いかもしれない。 ? 拡張子でファイルの中身を判断するだけでなく、頭のバ イナリってみたりします? ? magick (/usr/share/mime/magick 等)ファイルを見ると、典型的な ファイル形式の頭4バイトが列挙されてて便利です。 ? ZIP パスワードの入力を自動化できません? ? Deflate(RFC1951),Zlib(RFC1950), Gzip(RFC1952) みたいには仕 様が公開されていないので、調べていません。
53.
以上 ? ご清聴ありがとうございました
Download