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 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
PHP 数组基础知识小结
Aug 20 PHP
php替换超长文本中的特殊字符的函数代码
May 22 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
php获取根域名方法汇总
Oct 28 PHP
Yii2框架使用计划任务的方法
May 25 PHP
PHP自定义函数获取URL中一级域名的方法
Aug 23 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 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 应用程序安全防范技术研究
2009/09/25 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
js opener的使用详解
2014/01/11 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
python集合用法实例分析
2015/05/30 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
大学生活学习的自我评价
2013/12/03 职场文书
爱之链教学反思
2014/04/30 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python