不少时候,数据并非用文本的方式保存的,这就须要将二进制数据读取出来,还原成咱们须要的格式。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!'; } |