Submit Search
Upload
PHP でバイナリ変換プログラミング
•
Download as PPTX, PDF
•
12 likes
•
19,032 views
Yo Ya
Follow
バイナリ処理の前提知識から openpear/IO_Bit の紹介、応用事例まで
Read less
Read more
Technology
Report
Share
Report
Share
1 of 53
Download now
Recommended
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
Modeling in the Agile Age - JP
Modeling in the Agile Age - JP
Kenji Hiranabe
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
増田 亨
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
Recommended
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
Modeling in the Agile Age - JP
Modeling in the Agile Age - JP
Kenji Hiranabe
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
増田 亨
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
A AOKI
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
増田 亨
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だ
Iwao Harada
名は体を表していますか
名は体を表していますか
infinite_loop
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Koichiro Matsuoka
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話
natsumi_ishizaka
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
Yoshifumi Kawai
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
Unity Technologies Japan K.K.
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Akira Inoue
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
Yuta Hiroto
設計してますか?
設計してますか?
ke-m kamekoopa
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
Manabu Yasuda
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
Sadayuki Furuhashi
PHP AV BINDING
PHP AV BINDING
Yo Ya
More Related Content
What's hot
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
A AOKI
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
増田 亨
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だ
Iwao Harada
名は体を表していますか
名は体を表していますか
infinite_loop
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Koichiro Matsuoka
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話
natsumi_ishizaka
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
Yoshifumi Kawai
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
Unity Technologies Japan K.K.
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Akira Inoue
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
Yuta Hiroto
設計してますか?
設計してますか?
ke-m kamekoopa
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
Manabu Yasuda
What's hot
(20)
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だ
名は体を表していますか
名は体を表していますか
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
マスターデータの キャッシュシステムの改善の話
マスターデータの キャッシュシステムの改善の話
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
設計してますか?
設計してますか?
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
Unityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
Viewers also liked
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
Sadayuki Furuhashi
PHP AV BINDING
PHP AV BINDING
Yo Ya
Imagemagickknowhow
Imagemagickknowhow
Yo Ya
GoImagickThumbnail
GoImagickThumbnail
Yo Ya
PHPでのSWF編集とその応用
PHPでのSWF編集とその応用
Yo Ya
php5-gd で画像を弄る話
php5-gd で画像を弄る話
Yo Ya
TwitterImgUpload
TwitterImgUpload
Yo Ya
wildimagebinary
wildimagebinary
Yo Ya
退職PDFメーカーの作り方
退職PDFメーカーの作り方
Yo Ya
コンピュータ画像うんちく
コンピュータ画像うんちく
Yo Ya
chokaizomae
chokaizomae
Yo Ya
How to read SWF
How to read SWF
Yo Ya
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
Yo Ya
Fbx解説 (1 構文編) (1)
Fbx解説 (1 構文編) (1)
らりお ザ・何とは言わない天然水ソムリエ
goimagick-syokai-II
goimagick-syokai-II
Yo Ya
go-thumber-imagick
go-thumber-imagick
Yo Ya
Viewers also liked
(16)
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
PHP AV BINDING
PHP AV BINDING
Imagemagickknowhow
Imagemagickknowhow
GoImagickThumbnail
GoImagickThumbnail
PHPでのSWF編集とその応用
PHPでのSWF編集とその応用
php5-gd で画像を弄る話
php5-gd で画像を弄る話
TwitterImgUpload
TwitterImgUpload
wildimagebinary
wildimagebinary
退職PDFメーカーの作り方
退職PDFメーカーの作り方
コンピュータ画像うんちく
コンピュータ画像うんちく
chokaizomae
chokaizomae
How to read SWF
How to read SWF
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
Fbx解説 (1 構文編) (1)
Fbx解説 (1 構文編) (1)
goimagick-syokai-II
goimagick-syokai-II
go-thumber-imagick
go-thumber-imagick
Similar to PHP でバイナリ変換プログラミング
計算機理論入門03
計算機理論入門03
Tomoyuki Tarumi
Binary indexed tree
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
Javaセキュアコーディングセミナー東京第2回講義
Javaセキュアコーディングセミナー東京第2回講義
JPCERT Coordination Center
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
Tora pointer3
Tora pointer3
MARISHI
Pycairo を使ってみる その1
Pycairo を使ってみる その1
ryos36
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
Tetsuya Yoshida
第10回 計算機構成
第10回 計算機構成
眞樹 冨澤
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
5 Info Theory
5 Info Theory
melvincabatuan
Unicodeについて教えてgooでしつこくきいてみたよ♪
Unicodeについて教えてgooでしつこくきいてみたよ♪
1000 VICKY
Deflate
Deflate
7shi
言語処理系入門10
言語処理系入門10
Kenta Hattori
String representation in py3k
String representation in py3k
Atsuo Ishimoto
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Noritada Shimizu
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
Hiroki Mizukami
kagamicomput201707
kagamicomput201707
swkagami
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
Preferred Networks
Similar to PHP でバイナリ変換プログラミング
(20)
計算機理論入門03
計算機理論入門03
Binary indexed tree
Binary indexed tree
プログラムを高速化する話
プログラムを高速化する話
Javaセキュアコーディングセミナー東京第2回講義
Javaセキュアコーディングセミナー東京第2回講義
ウェーブレット木の世界
ウェーブレット木の世界
明日使えないすごいビット演算
明日使えないすごいビット演算
Tora pointer3
Tora pointer3
Pycairo を使ってみる その1
Pycairo を使ってみる その1
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
第10回 計算機構成
第10回 計算機構成
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
5 Info Theory
5 Info Theory
Unicodeについて教えてgooでしつこくきいてみたよ♪
Unicodeについて教えてgooでしつこくきいてみたよ♪
Deflate
Deflate
言語処理系入門10
言語処理系入門10
String 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 games
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
kagamicomput201707
kagamicomput201707
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
Recently uploaded
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
Recently uploaded
(7)
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
PHP でバイナリ変換プログラミング
1.
PHPでバイナリ変換
プログラミング 〜 前提知識から 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 now