不少時候,數據並非用文本的方式保存的,這就須要將二進制數據讀取出來,還原成咱們須要的格式。PHP在二進制處理方面也提供了強大的支持。javascript
下面以讀取並分析一個PNG圖像的文件頭爲例,講解如何使用PHP讀取和分析二進制文件。php
爲了完成任務,下面簡單介紹一下PNG文件格式。 PNG是一種無損壓縮的圖像文件格式,該格式的第1-8字節保存着PNG署名域,內容以下:java
咱們的任務就是將這個文件頭讀取出來。數組
更詳細的關於PNG格式的介紹: * http://www.w3.org/TR/2003/REC-PNG-20031110/ * http://www.libpng.org/pub/png/安全
1 2 3 4 5 6 |
$filePath = "icon.png"; //必須使用rb來讀取文件,這樣能保證跨平臺二進制數據的讀取安全 $fh = fopen($filePath, "rb"); //僅讀取前面的8個字節 $head = fread($fh, 8); fclose($fh); |
上面的代碼已經把咱們須要的8個字節讀入變量head中了。head是一個保存二進制數據的數組,咱們還須要對它作一些操做才能獲得咱們須要的數據。函數
unpack能夠將二進制數據解析成關係數組,它接受2個參數,第一個提供解析方式字符串(見下方),第二個參數就提供咱們前面讀出的head變量就能夠了。spa
unpack的第一個參數在在使用上有一點點小技巧,下面是範例:.net
如今試着讀取第1個字節:code
讀取全部的8個字節,用斜槓能夠分隔:blog
1 2 3 |
$arr = unpack("Chead/C3string/C4number", $head); print_r($arr); //Array ( [head] => 137 [string1] => 80 [string2] => 78 [string3] => 71 [number1] => 13 [number2] => 10 [number3] => 26 [number4] => 10 ) |
把string開頭的鍵拼成字符串:
1 2 3 4 5 6 7 |
$arr = unpack("Chead/C3string/C4number", $head); for($i=1;$i<=3;$i++) { $type.=chr($arr['string'.$i]); } echo $type; //PNG |
上面使用print_r打印出來的內容,都是十進制數字,若是但願直接獲得十六進制值,能夠使用bin2hex函數。
1 2 |
echo bin2hex($head[0]); //89 |
注意,使用這種方法獲得的是字符串,並非數字。所以下面的條件是不成立的:
1 2 3 4 |
if(bin2hex($head[0]) == 0x89) { echo 'match!'; } |