在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:将文件内容读入一个字符串 ...
随机推荐
- Java实例练习——基于UDP协议的多客户端通信
昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...
- 在 windows 下搭建 IDEA + Spark 连接 Hive 的环境
为了开发测试方便,想直接在 IDEA 里运行 Spark 程序,可以连接 Hive,需不是打好包后,放到集群上去运行.主要配置工作如下: 1. 把集群环境中的 hive-core.xml, hdfs- ...
- UML——初识
初识 刚刚接触到UML的时候,先看的书,对整本书的内容做了宏观的把控.感觉UML这个东西和自己想象中的不一样.起初我认为它只是一个工具,将软件开发过程中不同的阶段用不用种类的图表现出来,后来才发现它是 ...
- 51nod1305(简单逻辑)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1305 题意:中文题诶- 思路:1e5的数据直接暴力肯定是不行 ...
- 如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参
[前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC ...
- DNS解析工具--nslookup和dig使用
1.nslookup使用 [root@master ~]# nslookup> server 8.8.8.8 #指定域名服务器Default server: 8.8.8.8Address: ...
- Flutter SDK的下载与安装步骤 (mac版)
本月初(应该是2018年12月4日),Google在其Flutter Live 2018大会上正式发布 Flutter 1.0 版本. 当然我们不会怀疑Google团队的技术实力,但它和React N ...
- git 处理 crlf rf
假如你正在 Windows 上写程序,又或者你正在和其他人合作,他们在 Windows 上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题.这是因为 Windows 使用回车和换行两 ...
- jQuery中ready和load的区别
<span style="white-space:pre"> </span>//document ready $(document).read ...
- js如何删除json里的值
思路 第一种方法:通过把json中需要的值取出来,重新生成json对象,这种方法比较笨 第二种方法:通过delete 删除属性,这种方法比较常用,在第三方js库中经常能看到,推荐 举例 1 2 3 4 ...