PHP でバイナリプログラミン グ 2010/05/11 よや

Slides:



Advertisements
Similar presentations
Nano 北海道大学大学院 理学院 宇宙理学専攻 修士課程 1 年 堺 正太朗 nano. nano ?? Curses を用いたテキストエディタの一種 スクリーンエディタ CUI を用いて編集可能.
Advertisements

UGUI を 使ってみよう ( 導入・紹介?編 ) 1. uGUI とは O Unity 4.6 から使えるようになった UI (ユー ザーインターフェース)システム O 8 月: Unity4.6 β uGUI 試用版公開 O 11 月: Unity4.6 uGUI 正式版公開 正式版公開で、 機能紹介ブロ.
XML と Excel によるデータ化の違い (1) Excel ファイルのままでは検索はできない! (2) Excel ファイルでは、項目の追加や削除に対応できな い! (3) Excel ファイルでは、品質の機械的なチェックが困難 (4) Excel では、大きなデータ、大量のデータに対応できな.
位置情報と私 木村岳文 / 位置情報と私 / はじめに GPS 付き携帯、ハンディ GPS などを使っ て、お手軽に自分が地球上のどこにいる かを調べられるようになってきました。 このデータをつかって何かおもしろいこ とができそうな予感。 具体的にどうしたらおもしろいかはよく.
基盤地図情報の活用 中村 憲. 基盤地図情報とは 国土地理院が整備 様々な機関が作成した地図データを統一フォー マットでネット上で公開 無料 ( 登録必要 ) OCAD 等で利用するためには形式を変換する必要 あり 公開範囲は順次拡大中 GPS との相性もいい ( リアルワールド座標 )
Windows 環境から SAS を使う 長野 祐一郎 1. データのダウンロード 2. データの加工 3. プログラムの作成 4.TeraTerm によるプログラムの実行 5. 処理結果の確認 6.SAS のデータ処理を概観 今回の授業では、 Windows 環境で作成されたデータを.
第6回 JavaScript ゼミ セクション3-6 発表者 直江 宗紀. 組み込み関数  JavaScript に予め用意された関数  特定のオブジェクトに依存していない  単に関数名で呼び出すことが可能.
1 なんとなく Ajax ~新しくて古い XMLHttp 川合孝典 (Kansai.pm) 2005/5/22.
電子書籍の検索機能の改善 木下研究室 201002713 鴫原 善寿. 背景 スマートフォンなどの携帯端末の普及と ともに電子書籍に注目が浴びた。中でも amazon の kindle など電子書籍の専用端末も 現れた。 電子書籍はデータなので本棚もいらず、 持ち運びも容易になるなど様々な恩恵を もたらした。
Flash SWF ファイル書き換え PHP extension 2008 年 7 月 21 日 よや.
PHP AV(Audio Visual) 拡張 クライアントサイド PHP アプリケーションPHP
(実はアイコンは単なる飾りで、この縦書きの部分のどこをクリックしても次のページに移動します。)
Unix の ファイルシステム(File System)
PHP AV(Audio Visual) 拡張 PHP asアプリケーション
ブラウザの基本操作 前のページに戻る ブラウザの左上にある 「戻る」ボタンで、自分がたどってきた一つ前のページに戻ることができます。
Flash 書き換え PHP extension “SWF Editor”
IT講習会 MicrosoftWord(2007ver.)編 (Wed) Edited by KON
JavaScript プログラミング入門 2006/11/10 神津.
コンパイラ 2011年10月17日
情報処理基礎 2006年 6月 1日.
Excel による データベース入門 Ver /9.
Flash 書き換え PHP extension “SWF Editor”
しらたま みんなもっとツール作ろうよ! しらたま 08/08/10 うかべん 横浜#2.
ジオポ 位置情報を短縮して使いやすく (c) creco.
伺か with なでしこ 発表者:しらたま /05/05 うかべん大阪#3.
基礎プログラミングおよび演習 第9回
ファイルシステムとコマンド.
Phenixサーバ クラックまとめ.
ユーリテクノスのFlashテクノロジーを 利用した様々なサービスのご提案
心理学情報処理法Ⅰ コンピュータにおけるデータ表現 マルチメディアとコンピュータ.
Flash 書き換え PHP extension “SWF Editor”
RAD Studio 14/09/27 TEffectを使った綺麗なForm
C言語講座 第4回 ポインタ.
PHP Framework Update symfony 編 株式会社ディノ 月宮紀柳.
AR概要とNyARToolkitについて
コンパイラ 2012年10月15日
スクリプト言語を用いたPHITSの連続実行
CSVファイルとは? CSVとは、Comma Separated Value(カンマで区切られた値)の頭文字をとったものです。つまり、CSVファイルとは、値(数値や文字等)をカンマ(,)で区切って書いたテキストファイルのことを指しています。 メリットは、異なるソフト間でデータの受け渡しをする時によく使われます。
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
平成22年6月15日 図書系職員のための アプリケーション開発講習会
「ユーザー設定リスト」の作成と削除 ◎ 新しい「リスト」の作成法
情報処理技法(リテラシ)I 第10回:Excel (1/2)
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
プログラミング応用 printfと変数.
独習XML 第2章 XML文書の構成要素 2.1 XMLの文字と文字列 2.2 コメント
プログラミング 4 記憶の割り付け.
画像処理プログラムの説明.
第10章 これはかなり大変な事項!! ~ポインタ~
前回の練習問題.
2016年度 植物バイオサイエンス情報処理演習 第6回 情報処理(4) データを加工する・2
◎便利な利用方法 テクサポ 千島拓朗.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
情報処理概論Ⅰ 2007 第5回 2019/4/7 情報処理概論Ⅰ 第5回.
Htmlの基本.
プロジェクト演習Ⅱ インタラクティブゲーム制作
情報処理Ⅱ 第2回:2003年10月14日(火).
第1章 いよいよプログラミング!! ~文章の表示 printf~
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
忙しい人のためのR/Bioconductorの基礎
アルゴリズム入門 (Ver /10/07) ・フローチャートとプログラムの基本構造 ・リスト ・合計の計算
TCP/IP 通信テストツール TcpTestTool by PipeKatoo!
情報処理 II 第12回の教材 プレゼンテーションソフト PowerPoint 高知大学理学部 数理情報科学科1回生い組対象 担当:塩田教官
コンパイラ 2012年10月11日
プログラミング 4 文字列.
〜 前提知識から openpear/IO_Bit の紹介、応用事例まで 〜 “よや”
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
Presentation transcript:

PHP でバイナリプログラミン グ 2010/05/11 よや

はじめに PHP でバイナリ処理の話をあまり聞かない ので、あえてニッチを狙って ( 多分、 PHP 勉強会らしくない ) 発表をさせて頂きます。 キーワード : Binary 、 Format, Byte, デモ : JPEG から GPS 抜き出し (pure PHP で ) PHP というより、バイナリ入門といった要 素が強いですが、多分 … 、いつかお役に立 つ日が来ると思います。どうか、ご容赦 ください。

一応、自己紹介 でプログラミン グしてて困った事とか書いてます。 一昨年位まで、数十万ユーザ規模の携帯 サイトでアプリ開発をしていました。 – その時に、 PHP で主に動画や画像のフォー マットを弄るお仕事をしていました。フレー ムワークとかよく知りません。 今も、一応 PHP でお仕事してます。あと、 C 言語もたまに使います。

まずは、バイナリの定義 Wikipedia より – 通常バイナリとテキストは対比して用いられ る。 テキストとはデータの内容すべてを人間 が読んで理解できる (human-readable) 表現形 式を指し、 バイナリとはそうでない表現形式 を指すことが多い。 なので、本発表では、バイナリファイル の事を、 – テキストエディタで開いて読めない文字とか 記号が表示されるようなファイル。 という事にしておきます。

バイナリの実例 linux 等 UNIX 系 OS には ( 多分 ) hexdump とい うコマンドがあります。 -C オプションが 便利。 % hexdump -C aria.gif % hexdump -C kuriboo.png

バイナリの実感 先頭の4文字を見るとファイルの種類が 大体分かるようになっていて、その後ろ にはよく分からないデータが続いてます。 普通はここで読むのを諦めるのですが、 このよく分からないデータを PHP で解釈 して、欲しいデータを抜き出す方法につ いて説明します。

PHP とバイナリ PHP の string 型でバイナリ処理が 簡単 に出来るよ! というのが今回、紹介する Tips の肝です。 (注 ) PHP6 では UTF-8 対応したり取りやめたりと 怪しいので、今回の発表はとりあえず、 PHP5(PHP4 も多分大丈夫 ) only での話しだと思って ください。

本当に PHP の string 型でバイナリ 処理できるの? ぱっと思いつく不安としては、 \0 文字列終端 8bit スルー

( 不安その 1) \0 は? C 言語が典型で、 \0 を文字列の ( 最後を表す ) 終端 マークとして使う処理系も結構ある。 string 型を バイナリデータとして使う場合に、間に \0 が入る 事で途中で切れないかという不安。 簡単に確認 → 確認完了 \0 で途切れない。

( 不安その 2) 8bit スルー? 1 文字は 1byte で、 1byte は 8bit で構成されますが、 US-ASCII は 7bit で表現できるので、先頭 1bit が特 別扱いされたりしない? 8bit スルーです。日本語とかも入れられるし当然 ですね。

バイナリを取り込んでそのまま出 力 でも、細かい事考えなくても、バイナリファイルを取 り込んで、何も変えずに出力して同じデータに戻れば、 OKですよね。 入力をそのまま出力して、同じデータになりました。 後は、この途中でデータを分割したり結合したり、入 れ替えたりすれば編集できる事になります。

Byte 処理 String 関数が使えます – strlen ( データサイズを調べる。呼ぶたびに文字数を数えたりし ないので安心 ) ☆ – substr ( データから一部を抜き出す ) ☆ – substr_replace ( データの一部を入れ替える ) – strrev ( データの前後を逆にする ) Endian 処理に便利 ☆ – chr 数値 => 文字 ( バイナリ 1byte) ☆ – ord 文字 ( バイナリ 1byte) => 数値 ☆ – bin2hex ダンプするのに便利です ☆ これだけ分かれば大丈夫。 ( 今回の発表では、☆のついた関数 が出てきます ) pack 関連は次回発表の機会があれば … さて、 JPEG で試してみます。

JPEG の解析 今回のデモ iPhone で写真を撮ると、位置情報が付くらしい JPEG から GPS 情報を抜き出す (JPEG > Exif(Tiff) > GPSInfo) 2 重にくるまれてる …

初めの一歩 まずファイルを開いてみる 見てても読めないし法則も分からない。

JPEG フォーマットでググる 「 JPEG フォーマット 仕様」でググってみ る – bit は 2 byte に相当。 ffxx で区切るらしい。 眺めていると、何となくピンと来るはず。

JPEG を marker で分割してみる この ffxx のマークで分割してみます。 – Marker の種類 FFD8, FFE0, FFDB, FFC4, FFC0, FFC1, FFDD, FFDA … etc

データを切り出すクラス まず、バイナリの先頭から Byte を切り出 すクラスを作成 内部的に、何処まで読んだか (cursor) を覚 えておいて、そこから substr で一部の データを切り出すだけのクラス

marker 一個目 によれ ば、初めのマーカーは FFD8 (Start of Image)

Marker 逐次処理 SOI (Start of Image) と EOI (End of Image) は マーカー (2byte) だけ APP0, APP1, 等殆どのタグはマーカー (2byte) に続いて、長さ (2byte) 、その後ろ にデータが ( 長さ -2 分の ) 続く SOS は EOI の直前まで続く ( 途中で RST と いう別のタグがあるが、今回は中にまと めちゃう )

Marker 逐次処理コード

Marker 分割結果 分割できた

Marker の照らし合わせ

GPS 情報は Exif にくるまれてる 「 JPEG GPS フォーマット 仕様」でググる – ail/q ail/q 「 JPEG exif フォーマット 仕様」でググる – – /AboutExif.htm /AboutExif.htm – APP1 に入っているらしい。 ディレクトリ構造らしい。 ( 面倒そう …)

Little Endian ? Exif は Little Endian を使う事があるらしい バイナリを 16 進で見た並び => 対応する整 数値 – Big Endian – Little Endian

ByteStream の LittleEndian 対応

APP1 の抽出 JPEG を分解するついでに $jpeg_chunk 配列 に格納して $jpeg_chunk 配列から APP1 で Exif のデータ を抜き出す

Exif 分解コード

Exif 分解結果

GPSInfo の分解 GPS は GPSInfo というタグに入っているら しい 「 JPEG exif GPSInfo フォーマット 仕様」で ググる –

GPSInfo の分解コード

GPSInfo 分解結果 N は北緯、 E は東経、他は座標値等々 …

Bit 処理は … Byte を更に細かく区切った Bit 処理 (0,1 の データ ) もお話したかったのですが、時間 に収まらなかったのでもし要望があれば 次回に発表します。

まとめ バイナリは大抵 TLC 構造か、難しくても ディレクトリ構造なので、これらが分か れば大抵処理可能。今回は両方処理しま した。 TLC 構造 ディレクトリ構造

蛇足的な Tips PHP の閉じタグ ?> は使わない。 ?> の後ろに改行やゴ ミ文字があった場合に、テキストなら最後にゴミが付 くだけで大きな問題になりにくいが、バイナリだと致 命的。 $s = '' 等、文字列でも文字数が 0 だと、 $s{3} = 'A' とし た場合に、 array([3] => "A"); のように配列になる。 $s = ‘ ‘( 空白 1 文字 ) 等としとくと、 string(4) " A" のように 思った通りいく。足りない分は 0x20( スペース ) で padding されるのに注意 C 言語なら文字列から1文字抜き出して ASCII コードと して使えるが、 PHP の場合は文字は ord で ASCII コード 値に変換して、文字に戻す時は chr() を通す必要があ る。

次回予告 ( ?) 今回、 PHP らしくない力づくのスマートでない手 法の紹介でした。 もし、次回の要望があれば、 Flash SWF の書き換え について発表したいです。 Flash SWF は bit と signed 処理の組み合わせがあっ たりと、そこそこ面倒なので、今回の発表から外 しました。 Google 検索 : yoya swfed

あ…あ… ここまで頑張っておいて何ですが … /php-5.2.9/ext/exif/ data.php data.php var_dump(exif_read_data($argv[1])); !!!!!!!!

以上です ありがとうございました。