在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:将文件内容读入一个字符串 ...
随机推荐
- 清北刷题冲刺 10-28 p.m
水题(贪心) (water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每 ...
- Educational Codeforces Round 48 (Rated for Div. 2) B 1016B Segment Occurrences (前缀和)
B. Segment Occurrences time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- [Cqoi2014]危桥 (两遍网络流)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...
- 多级联动的select框
JS文件: ; (function($, w) { var LinkSelect = function(config) { var opt = { doms: config.doms || [], u ...
- 【ACM】最少乘法次数 - 树
最少乘法次数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...
- 成功安装tesserocr
首先按照官网的操作,出现了下面的错误. 错误描述: x86_64-linux-gnu-gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录 er ...
- Unity www动态加载网上图片
一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...
- Java文件与io——常见字符编码
在计算机世界里,任何的文字都是以指定的编码方式存在的. 常见编码有:ISO8859-1.GBK/GB2312.unicode.UTF ISO8859-1:编码属于单字节编码,最多只能表示0-255的字 ...
- IIS断开连接之后internet信息服务里面不显示本地计算机的解决方法
今天我断开了IIS的本地计算机连接之后,出现了无法连接的情况.具体如图: 解决方法: 右击->所有服务->重新启动iis即可.
- Maven的学习资料收集--(八) 构建MyBatis项目
在这里,写一下,怎么使用Maven构建MyBatis项目. 1. 新建一个Web项目 可以参考前面的博客 2. 修改pom.xml,添加MyBatis依赖 <project xmlns=&quo ...