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 相关文章推荐
一个odbc连mssql分页的类
Oct 09 PHP
为查询结果建立向后/向前按钮
Oct 09 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
Ajax PHP简单入门教程代码
Apr 25 PHP
php 无极分类(递归)实现代码
Jan 05 PHP
批量修改RAR文件注释的php代码
Nov 20 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
Mar 06 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
PHP Web表单生成器案例分析
Jun 02 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通过header实现文本文件下载的代码
2010/08/08 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
PHP CURL使用详解
2019/03/21 PHP
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
举例讲解Python中is和id的用法
2015/04/03 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
python解包概念及实例
2021/02/17 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
What is view? why do we have view?
2012/06/22 面试题
国贸专业自荐信范文
2014/03/02 职场文书
教研活动总结
2014/04/28 职场文书
企业宣传标语
2014/06/09 职场文书
小学安全汇报材料
2014/08/14 职场文书
个人工作年终总结
2015/03/09 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
实验心得体会范文
2016/01/25 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
了解Redis常见应用场景
2021/06/23 Redis
volatile保证可见性及重排序方法
2022/08/05 Java/Android