在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/
读取文件
1 |
$filePath = "icon.png"; |
上面的代码已经把我们需要的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个字节:
读取所有的8个字节,用斜杠可以分隔:
1 |
$arr = unpack("Chead/C3string/C4number", $head); |
把string开头的键拼成字符串:
1 |
$arr = unpack("Chead/C3string/C4number", $head); |
bin2hex
上面使用print_r打印出来的内容,都是十进制数字,如果希望直接得到十六进制值,可以使用bin2hex函数。
1 |
echo bin2hex($head[]); |
注意,使用这种方法得到的是字符串,并不是数字。因此下面的条件是不成立的:
1 |
if(bin2hex($head[]) == 0x89) |
在PHP中读取二进制文件的更多相关文章
- PHP将二进制文件存入数据库以及从数据库中读取二进制文件
<?php $file = 'abcd.sqlite'; mysql_connect('localhost','root','123456'); mysql_select_db('zblog') ...
- php中读取文件内容的几种方法
1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 ...
- java中读取文件以及向文件中追加数据的总结
package gys; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; imp ...
- 用 C# 读取二进制文件
当想到所有文件都转换为 XML时,确实是一件好事.但是,这并非事实.仍旧还有大量的文件格式不是XML,甚至也不是ASCII.二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递.相比之下,在处 ...
- 信息管理代码分析<二>读取二进制文件数据
first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...
- PHP中读取文件的几个方法
整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件 ...
- 利用Python从文件中读取字符串(解决乱码问题)
首先声明这篇学习记录是基于python3的. python3中,py文件中默认的文件编码就是unicode,不用像python2中那样加u,比如u'中文'. 不过在涉及路径时,比如C:\Users\A ...
- TF从文件中读取数据
从文件中读取数据 在TensorFlow中进行模型训练时,在官网给出的三种读取方式,中最好的文件读取方式就是将利用队列进行文件读取,而且步骤有两步: 把样本数据写入TFRecords二进制文件 从队列 ...
- php中读取文件内容的几种方法。(file_get_contents:将文件内容读入一个字符串)
php中读取文件内容的几种方法.(file_get_contents:将文件内容读入一个字符串) 一.总结 php中读取文件内容的几种方法(file_get_contents:将文件内容读入一个字符串 ...
随机推荐
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...
- bzoj4873: [Shoi2017]寿司餐厅(最小割)
传送门 大佬们是怎么一眼看出这是一个最大权闭合子图的……大佬好强->这里 1.把所有区间$(i,j)$看成一个点,如果权值大于0,则从$S$向他连边,容量为权值,否则从它向$T$连边,容量为权值 ...
- jmeter - 录制app接口
准备: 1.手机 2.wifi 3.Jmeter 步骤: 1.Jmeter->文件->Template 2.手机设置代理 端口:8888:电脑的ip,如下图设置 3.点击启动 ...
- 洛谷P4116 Qtree3
题目描述 给出\(N\)个点的一棵树(\(N-1\)条边),节点有白有黑,初始全为白 有两种操作: \(0\) \(i\) : 改变某点的颜色(原来是黑的变白,原来是白的变黑) \(1\) \(v\) ...
- Mediator模式(仲裁者设计模式)
Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...
- Migration-添加表(加外键)
public partial class _222 : DbMigration { public override void Up() { //DropForeignKey("dbo.Ass ...
- android SDK manager 无法获取更新版本的解决办法
http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息: http://developer.android.c ...
- Jmeter4.0----正则表达式提取器(12)
1.说明 有时候需要将前一个请求返回的数据作为下一个请求的参数时,我们就需要正则表达式提取器.使用正则表达式提取器去提取我们想要的部分再传入后面的请求中. (之前看了一篇不错的博客,可以参考学习 ht ...
- 【ACM】大数阶乘 - Java BigInteger实现
大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数 ...