在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:将文件内容读入一个字符串 ...
随机推荐
- KONG -- 图形化管理(Kong Dashboard)
前面安装的 KONG 的版本是社区版的 1.0.2,官方的 KONG Manager 好像只有企业版才提供.在 github 上找了一个开源的图形化管理应用 -- Kong Dashboard (ht ...
- elasticsearch 聚合查询
1. 按照 tags 字段 进行分组 GET /ecommerce/product/_search{ "size": 0, "aggs": { &quo ...
- Node.js 内置模块crypto加密模块(4) Diffie Hellman
Diffie-Hellman( DH ):密钥交换协议/算法 ( Diffie-Hellman Key Exchange/Agreement Algorithm ) 百科摘录: Diffie-Hell ...
- 点分治【bzoj1468】 Tree
点分治[bzoj1468] Tree Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边 ...
- 2018年12月30&31日
小结:昨天由于做的题目比较少,所以就和今天写在一块了,昨天学习了差分约束和树上差分,当然树上差分是用线段树来维护的,今天重点整理了博客\(233\),然后做了几个题. 一. 完成的题目: 洛谷P327 ...
- 黑马SSM项目练习中的Oracle操作
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- 安装php过程中的错误和解决方式 configure: error: jpeglib.h not found
centos6.5 32位系统: checking for the location of libpng... yeschecking for the location of libXpm... no ...
- 零散的JS和node.js小知识
JS的连续赋值和曾经出现的怪异情况 let a=1; let b=a=3; 如上的真实赋值过程 => a=1 => a=3 => b=3 => 一般来说,等号是从右向左赋值的 ...
- Visitor模式(访问者设计模式)
Visitor ? 在Visitor模式中,数据结构与处理被分离开来.我们编写一个表示"访问者"的类来访问数据结构中的元素, 并把对各元素的处理交给访问者类.这样,当需要增加新的处 ...