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 相关文章推荐
PHP 反向排序和随机排序代码
Jun 30 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
php生成短网址/短链接原理和用法实例分析
May 29 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中函数内引用全局变量的方法
2008/10/20 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
测试你的JS的掌握程度的代码
2009/12/09 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
详解Vue之事件处理
2020/07/10 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
python的id()函数解密过程
2012/12/25 Python
python如何获取服务器硬件信息
2017/05/11 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
Python使用configparser库读取配置文件
2020/02/22 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
高一历史教学反思
2014/01/13 职场文书
出租房屋协议书
2014/09/14 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
签约仪式致辞
2015/07/30 职场文书
研讨会致辞
2015/07/31 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
alibaba seata服务端具体实现
2022/02/24 Java/Android