php使用pack处理二进制文件的方法


Posted in PHP onJuly 03, 2014

php读写二进制文件可以使用pack和unpack函数。
今天要处理一个二进制文件的问题,所以需要用一下,特意了解一下pack的用法,unpack用法与此类似。

简单来说,pack函数就是给一个目标格式,和相应的参数,就可以返回二进制数据了。

下面举例加以说明,对于四个整数:

pack("L4", 0,1,2,3)
pack("LLLL", 0,1,2,3)
pack("L", 0).pack("L", 1).pack("L", 2).pack("L", 3)

上面的处理结果是一样的,也就是说,format是描述后面的数据的格式。
至于具体format可以用什么,看看format characters就知道了。
比如一个30字符的 pack("a30", "https://3water.com") ,就是这个意思,很简单

pack函数的官方声明如下:

引用
pack
(PHP 3, PHP 4, PHP 5)

pack -- Pack data into binary string
Description
string pack ( string format [, mixed args [, mixed ...]] )

Pack given arguments into binary string according to format. Returns binary string containing data. 

The idea to this function was taken from Perl and all formatting codes work the same as there, however, there are some formatting codes that are missing such as Perl's "u" format code. The format string consists of format codes followed by an optional repeater argument. The repeater argument can be either an integer value or * for repeating to the end of the input data. For a, A, h, H the repeat count specifies how many characters of one data argument are taken, for @ it is the absolute position where to put the next data, for everything else the repeat count specifies how many data arguments are consumed and packed into the resulting binary string. Currently implemented are

表格 1. pack() format characters

Code Description 
a NUL-padded string 
A SPACE-padded string 
h Hex string, low nibble first 
H Hex string, high nibble first 
c signed char 
C unsigned char 
s signed short (always 16 bit, machine byte order) 
S unsigned short (always 16 bit, machine byte order) 
n unsigned short (always 16 bit, big endian byte order) 
v unsigned short (always 16 bit, little endian byte order) 
i signed integer (machine dependent size and byte order) 
I unsigned integer (machine dependent size and byte order) 
l signed long (always 32 bit, machine byte order) 
L unsigned long (always 32 bit, machine byte order) 
N unsigned long (always 32 bit, big endian byte order) 
V unsigned long (always 32 bit, little endian byte order) 
f float (machine dependent size and representation) 
d double (machine dependent size and representation) 
x NUL byte 
X Back up one byte 
@ NUL-fill to absolute position

看累了英文,下面来看看对应的中文解释:

引用
pack()函数的作用是:将数据压缩成一个二进制字符串。

a - NUL-padded string 
a - NUL- 字符串填满[padded string] 
A - SPACE-padded string 
A - SPACE- 字符串填满[padded string] 
h - Hex string, low nibble first 
h ? 十六进制字符串,低“四位元”[low nibble first] 
H - Hex string, high nibble first 
H - 十六进制字符串,高“四位元”[high nibble first] 
c - signed char 
c ? 带有符号的字符 
C - unsigned char 
C ? 不带有符号的字符 
s - signed short (always 16 bit, machine byte order) 
s ? 带有符号的短模式[short](通常是16位,按机器字节顺序) 
S - unsigned short (always 16 bit, machine byte order) 
S ? 不带有符号的短模式[short](通常是16位,按机器字节排序) 
n - unsigned short (always 16 bit, big endian byte order) 
n -不带有符号的短模式[short](通常是16位,按大endian字节排序) 
v - unsigned short (always 16 bit, little endian byte order) 
v -不带有符号的短模式[short](通常是16位,按小endian字节排序) 
i - signed integer (machine dependent size and byte order) 
i ? 带有符号的整数(由大小和字节顺序决定) 
I - unsigned integer (machine dependent size and byte order) 
I ? 不带有符号的整数(由大小和字节顺序决定) 
l - signed long (always 32 bit, machine byte order) 
l? 带有符号的长模式[long](通常是32位,按机器字节顺序) 
L - unsigned long (always 32 bit, machine byte order) 
L ? 不带有符号的长模式[long](通常是32位,按机器字节顺序) 
N - unsigned long (always 32 bit, big endian byte order) 
N ? 不带有符号的长模式[long](通常是32位,按大edian字节顺序) 
V - unsigned long (always 32 bit, little endian byte order) 
V? 不带有符号的长模式[long](通常是32位,按小edian字节顺序) 
f - float (machine dependent size and representation) 
f ?浮点(由大小和字节顺序决定) 
d - double (machine dependent size and representation) 
d ? 双精度(由大小和字节顺序决定) 
x - NUL byte 
x ? 空字节[NUL byte] 
X - Back up one byte 
X- 后面一个字节[Back up one byte] 
@ - NUL-fill to absolute position 
@ - NUL- 添加到一个绝对位置[absolute position]

示例代码如下:

<?php 
$code=array(
"username"=>array("A7","张三adfb12"),
"pass"=>array("A10","asdf*#1"),
"age"=>array("C","23"),
"birthday"=>array("I","19900101"),
"email"=>array("A50","3water.com"));
$stream=join("\0",parkByArr($code));
echo $stream,strlen($stream);
file_put_contents("1.txt",$stream);//将流保存起来便于下面读取
function parkByArr($arr)
{
 $atArr=array();
 foreach ($arr as $k=>$v)
 {
 $atArr[]=pack($v[0],$v[1]);
 }
 return $atArr;
}
function getAscill($str)
{
 $arr=str_split($str);
 foreach ($arr as $v)
 {
 echo $v,"=",ord($v),"\n";
 }
}
$code=array(
"username"=>array("A20"),
"pass"=>array("A10"),
"age"=>array("C"),
"birthday"=>array("I"),
"email"=>array("A50"));
$stream=file_get_contents("1.txt");
var_dump(parkByArr($stream,$code));
function parkByArr($str,$code)
{
 $Arr=explode("\0",$str);
 $atArr=array();
 $i=0;
 foreach ($code as $k=>$v)
 {
 $atArr[$k]=unpack($v[0],$Arr[$i]);
 $i++;
 }
 return $atArr;
}
PHP 相关文章推荐
SSI指令
Nov 25 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
yii gridview实现时间段筛选功能
Aug 15 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
yii2.0框架场景的简单使用示例
Jan 25 PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 PHP
php访问对象中的成员的实例方法
Nov 17 PHP
PHP源码分析之变量的存储过程分解
Jul 03 #PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 #PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 #PHP
Thinkphp中import的几个用法详细介绍
Jul 02 #PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 #PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 #PHP
用PHP解决的一个栈的面试题
Jul 02 #PHP
You might like
php页面防重复提交方法总结
2013/11/25 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
PHP多态代码实例
2015/06/26 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
Javascript 读书笔记索引贴
2010/01/11 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
python中MySQLdb模块用法实例
2014/11/10 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
Python subprocess模块常见用法分析
2018/06/12 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
Jar包的作用是什么
2014/03/30 面试题
视光学专业毕业生推荐信
2013/10/28 职场文书
夜班门卫岗位职责
2013/12/09 职场文书
委托书模板
2014/04/04 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
使用Python解决图表与画布的间距问题
2022/04/11 Python