在PHP中读取二进制文件

在PHP中读取二进制文件

很多时候,数据并不是用文本的方式保存的,这就需要将二进制数据读取出来,还原成我们需要的格式。PHP在二进制处理方面也提供了强大的支持。

任务

下面以读取并分析一个PNG图像的文件头为例,讲解如何使用PHP读取和分析二进制文件。

涉及函数

PNG格式简介

为了完成任务,下面简单介绍一下PNG文件格式。
PNG是一种无损压缩的图像文件格式,该格式的第1-8字节保存着PNG署名域,内容如下:

  • 十进制: 137 80 78 71 13 10 26 10
  • 十六进制: 89 50 4e 47 0d 0a 1a 0a

我们的任务就是将这个文件头读取出来。

更详细的关于PNG格式的介绍:
http://www.w3.org/TR/2003/REC-PNG-20031110/
http://www.libpng.org/pub/png/

读取文件

$filePath = "icon.png";
//必须使用rb来读取文件,这样能保证跨平台二进制数据的读取安全
$fh = fopen($filePath, "rb");
//仅读取前面的8个字节
$head = fread($fh, 8);
fclose($fh);

上面的代码已经把我们需要的8个字节读入变量head中了。head是一个保存二进制数据的数组,我们还需要对它做一些操作才能得到我们需要的数据。

unpack

unpack可以将二进制数据解析成关系数组,它接受2个参数,第一个提供解析方式字符串(见下方),第二个参数就提供我们前面读出的head变量就可以了。

  • a:NULL填充的字节串
  • A:空格填充的字节串
  • h:十六进制数,低四位字节优先
  • H:十六进制数,高四位字节优先
  • c:有符号字符
  • C:无符号字符
  • s:有符号短整型(总是16位,机器字节序)
  • S:无符号短整型(总是16位,机器字节序)
  • n:无符号短整型(总是16位,大尾字节序)
  • v:无符号短整型(总是16位,小尾字节序)
  • I:有符号整型(机器相关大小和字节序)
  • I:无符号整型(机器相关大小和字节序)
  • l:有符号长整型(总是32位,机器字节序)
  • L:无符号长整型(总是32位,机器字节序)
  • N:无符号长整型(总是32位,大尾字节序)
  • V:无符号长整型(总是32位,小尾字节序)
  • f:浮点数(机器相关大小和表示)
  • d:双精度数(机器相关大小和表示)
  • x:空字节
  • X:倒退一个字节
  • @:用NULL填充绝对位置

unpack的第一个参数在在使用上有一点点小技巧,下面是范例:

  • C 读取1个字符,返回的数组索引为1
  • C4 读取4个字节,每个字节一个字符,返回的数组索引为1,2,3,4
  • C4head 读取4个字符,每个字节一个字符,返回的数组索引为head1,head2,head3,head4
  • Chead 读取1个字符,返回的数组索引为head

现在试着读取第1个字节:

$arr = unpack("Chead", $head);
print_r($arr);
//Array ( [head] => 137 )

读取所有的8个字节,用斜杠可以分隔:

$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开头的键拼成字符串:

$arr = unpack("Chead/C3string/C4number", $head);
for($i=1;$i<=3;$i++)
{
    $type.=chr($arr['string'.$i]);
}
echo $type;
//PNG

bin2hex

上面使用print_r打印出来的内容,都是十进制数字,如果希望直接得到十六进制值,可以使用bin2hex函数。

echo bin2hex($head[0]);
//89

注意,使用这种方法得到的是字符串,并不是数字。因此下面的条件是不成立的:

if(bin2hex($head[0]) == 0x89)
{
    echo 'match!';
}

升级CentOS 5.x中的PHP 5.1到5.3

升级CentOS 5.x中的PHP 5.1到5.3

2012-04-19 更新:后来发现直接使用yum install php53,也能安装php,而且处于官方源中。所以可以先试试这个,不行再试下面的方法。

服务器版本为CentOS 5.8,自带的php为5.1.6。在配置phpMyAdmin的时候,发现必须要PHP 5.2才可以支持,但yum的源中并没有PHP 5.2,无法使用yum来升级。

首先按照官方wiki的说明进行了修改,结果没用,yum始终报告5.1.6是最新版,无法升级。

找到一篇介绍文章服务器配置之-在CentOS中安装php5.3,但发现文章中提供的download.fedora.redhat.com网站已经无法访问。google了一下,原来是http://download.fedora.redhat.com下载地址已经改为http://dl.fedoraproject.org。下面是更新后的方法(针对64bit CentOS 5.x): 继续阅读升级CentOS 5.x中的PHP 5.1到5.3

2008动态网站快速架设与开发培训班录屏文件发布

2008年7月23日9:53:35更新:添加第一期班所有录屏文件
2008年7月24日9:25:10更新:添加第二期班部分录屏文件
2008年7月25日23:54:03更新:添加第二期所有录屏文件和源程序

经过培训内容调查和在线报名,2008动态网站快速架设与开发培训班已经火热开班!目前第一期班已经结束,第二期班正在进行中。 进行了二期培训并圆满结束。为了方便参加培训的学员进行复习,也方便没有来参加培训的老师能学到对自己有用的东西,现将培训过程的录屏文件予以发布。录屏文件包括教师授课过程中的电脑屏幕上所有的操作和教师的同步语音,希望对大家有帮助。

注意:两期培训的内容是基本相同的,只是根据学员的接收程度,第二期进行了少许调整。建议大家下载第二期的录屏文件,同时,第一期班的第一天(7月14日)由于设备没有准备好,没有进行录屏。
如果有不能下载的,请留言或者E-mail联系我:
E-mail

继续阅读2008动态网站快速架设与开发培训班录屏文件发布

解决使用DOCMAN下载的文件不全的问题

一直有网友反映在多媒体空间上下载的文件不全而导致无法解压缩。由于我无法重现错误,就以为是网友的个别现象。但是自从发布了Flash 8 教学辅助软件制作培训班所有相关资源下载后,有许多老师反映下载的录屏文件无法解压。我自己实验了一下,也确实有这样的问题。

问题主要表现在文件总是下载到4MB就停了,不论是使用IE直接下载还是使用迅雷等下载工具,下载下来的文件都不完整,导致无法解压。但是,直接引用文件名称下载,则没有这个问题。 继续阅读解决使用DOCMAN下载的文件不全的问题

自动修改DOCMAN上传的文件名称

DOCMANMambo/Joomla!的插件,我认为它是最好的下载插件。此插件的效果可以看这里

但是,从我升级到Joomla1.0.8(DOCMAN版本1.3RC2)以来,如果上传的文件名包含中文,那么上传到服务器的文件就会变成乱码。但是,这个文件名在DOCMAN的管理界面中却显示正常。

这个问题的原因,是因为我使用了UTF-8编码,因此,我需要修改DOCMAN,让它自动更改我上传的文件名。

找到DOCMAN_file.class.php文件中的_upload函数定义(大约在381行),修改它为如下所示: 继续阅读自动修改DOCMAN上传的文件名称

No input file specified.错误的解决

今天改过服务器的php.ini文件后,发现所有的页面都不能访问,显示为:“No input file specified.”

由于要同时支持.NET,服务器采用的是IIS。我改用Apache就没有这个问题。

这个问题很让人头疼。google了一阵之后没有找到好的方法。大都是说因为CGI的安全认证问题,而使用ISAPI模块方式安装PHP则没有这个问题。可是我恰恰就是用ISAPI模块方式安装的,为什么还有这个问题?

在微软的网站找到这篇文章How IIS launches a CGI application,里面讲到在注册表中添加CreateProcessAsUser值的方法(如下): 继续阅读No input file specified.错误的解决

几个常用的WAMP套件

WAMP,就是:Windows、Apache、MySQL和PHP,用于快速在Windows系统上搭建PHP开发和运行平台。
当然,也有LAMP(Linux、Apache、MySQL和PHP)。

  • XAMPP推荐!
    有for Linux、Windows、Mac OS X、Solaris等操作系统版本,还有一个Lite版本
    最新版本1.5.2,包括Apache HTTPD 2.2.0, MySQL 5.0.20, PHP 5.1.2 + 4.4.2-pl1 + PEAR + Switch, MiniPerl 5.8.7, Openssl 0.9.8a, PHPMyAdmin 2.8.0.3, XAMPP Control Panel 2.2, eAccelerator 0.9.4-rc1, Webalizer 2.01-10, Mercury Mail Transport System for Win32 and NetWare Systems v4.01a, FileZilla FTP Server 0.9.14a, SQLite 2.8.15, ADODB 4.80, Zend Optimizer 3.0.0, XAMPP Security
    Lite版本包括Apache 2.2.0 + PHP 5.1.2 (without PEAR) + MySQL 5.0.20 + phpMyAdmin 2.8.0.3 + Openssl 0.9.8 + SQLite 2.8.15 + eAccelerator 0.9.4 rc1
  • PHPnow(国产!)推荐!
    Win32 下绿色免费的 Apache + PHP + MySQL 环境套件包。
    简易安装、快速搭建支持虚拟主机的 PHP 环境。附带 PnCp.cmd 控制面板,帮助你快速配置你的套件,使用非常方便。
    PHPnow 是绿色的,解压后执行 Setup.cmd 初始化,即可得到一个 PHP + MySQL 环境。
    然后就可以直接安装 Discuz!, PHPWind, DeDe, WordPress 等程序。
    * 支持虚拟主机:便捷的虚拟主机管理
    * 虚拟主机代理:可与 IIS 共存 (泛解析代理)
    * 插件支持:ASP | ASP.NET | JSP
    喜欢自己配置 PHP 环境?
    PHPnow 仅使用了 DOS 命令脚本 和 PHP 程序,完全可以自己修改,打造自己的套件!
    手动配置 PHP 还是有必要掌握的,PHPnow 只是为你减少重复的动作。
  • EasyPHP
    当前最新版本1.8,包含Apache1.33、PHP4.3.10、Mysql4.1.9和PHPmyAdmin2.6.1
  • Uniform Server(miniServer)
    最新版本3.3,包括Apache2, Perl5, PHP5, MySQL5,可以以插件方式支持PHP4
  • AppServ
    最新版本2.4.5,包括Apache 1.3.34、PHP 4.4.1、MySQL 5.0.16、phpMyAdmin-2.5.7-pl1

2009年3月3日11:23:48更新