解析二进制流接口应用实例 pack、unpack、ord 函数使用方法


Posted in PHP onJune 18, 2013

在工作中,我也逐渐了解到pack,unpack,ord对于二进制字节处理的强大。 下面我逐一介绍它们。在我们工作中,用到它们的估计不多。 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收。当时在处理时候,查阅不少资料。因为它们使用确实比较少,也很少朋友工作中会用到它们。 在工作中,我也逐渐了解到pack,unpack,ord对于二进制字节处理的强大。 下面我逐一介绍它们。
pack函数说明:本函数用来将资料压缩打包到位的字符串之中。
语法:pack(format,args+)
参数 描述
format 必需。规定在包装数据时所使用的格式。
args+ 可选。规定被包装的一个或多个参数。
字符 说明
a 将字符串空白以 NULL 字符填满
A 将字符串空白以 SPACE 字符 (空格) 填满
h 十六进位字符串,低位在前
H 十六进位字符串,高位在前
c 有号字符
C 无号字符
s 有号短整数 (十六位,依计算机的位顺序)
S 无号短整数 (十六位,依计算机的位顺序)
n 无号短整数 (十六位, 高位在后的顺序)
v 无号短整数 (十六位, 低位在后的顺序)
i 有号整数 (依计算机的顺序及范围)
I 无号整数 (依计算机的顺序及范围)
l 有号长整数 (卅二位,依计算机的位顺序)
L 无号长整数 (卅二位,依计算机的位顺序)
N 无号短整数 (卅二位, 高位在后的顺序)
V 无号短整数 (卅二位, 低位在后的顺序)
f 单精确浮点数 (依计算机的范围)
d 倍精确浮点数 (依计算机的范围)
x 空位
X 倒回一位
@ 填入 NULL 字符到绝对位置
unpack函数说明:本函数用来将位的字符串的资料解压缩
语法:unpack(format,args+)
参数 描述
format 必需。规定在包装数据时所使用的格式。
args+ 可选。规定被包装的一个或多个参数。
参数与pack相同。
ord函数说明:返回对应字符的acill码值
语法:ord($character);
实例说明:

<?php 
//A字符 
$str=(pack("A*", "中国")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//H字符 
$str=(pack("H*", "fffe")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//C字符 
$str=(pack("C*", "55","56","57")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//i字符 短整形 32位 4个字节 64位8个字节 
$str=(pack("i", "100")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//s字符 短整形 2个字节 
$str=(pack("s", "100")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//l字符 长整形 4个字节 
$str=(pack("l", "100")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//f字符 单精度浮点 4个字节 
$str=(pack("f", "100")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
//d字符 双精度浮点 8个字节 
$str=(pack("d", "100")); 
echo $str,"=",strlen($str),"字节\n"; 
getAscill($str); 
function getAscill($str) 
{ 
$arr=str_split($str); 
foreach ($arr as $v) 
{ 
echo $v,"=",ord($v),"\n"; 
} 
echo "=============\r\n\r\n"; 
} 
?>

通过上面实例,我们可以看到,相同字符串,用不同格式存储,所占用的字节数不同。 这里也可以看到,以不同格式保存字符可以达存储节省空间。而且启到不可读加密效果。 突然想到一点,设计数据库字段类型问题,如果一个字段只是:10位长度整型。我们设置为整形:256*256*256*256 就4个字节,如果设置为10个长度字符串。那就占10个字节。整个消化空间就是2倍的。 设置正确字符类型对提高数据库性能有很多帮助。呵呵,有点跑题了……
php处理字节码通讯实例分析
刚刚说的pack作用:节省空间、加密格式
下面就这2个做一个实例说明,接口开发要求:
参数 描述
用户名 20字节,字符型
密码 10字节,字符型
年龄 1字节,无符char型
出生年月 4字节,整型(19800101)
邮箱 50字节,字符串
各字段间用:"\0"分割
A、PACK封包 
<?php 
$code=array( 
"username"=>array("A20","张三adfb12"), 
"pass"=>array("A10","asdf*#1"), 
"age"=>array("C","23"), 
"birthday"=>array("I","19900101"), 
"email"=>array("A50","zhangsan@163.com")); 
$stream=join("\0",packByArr($code)); 
echo $stream,strlen($stream); file_put_contents("c:/1.txt",$stream);    //将流保存起来便于下面读取 
function packByArr($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"; 
         } 
} 
?>

因为用”\0”分割,整个长度是89字节。通过上面输出,有一些字符串输出是可以读取的,其它都已经变成乱码了。这也是我说可以保密效果原因。
B、Unpack解包
解包需要按照,打包方式读取,该读取多长,该用什么类型读取,必须与打包规定一样。
<?php 
$code=array( 
"username"=>array("A20"), 
"pass"=>array("A10"), 
"age"=>array("C"), 
"birthday"=>array("I"), 
"email"=>array("A50")); 
$stream=file_get_contents("c:/1.txt"); 
var_dump(packByArr($stream,$code)); 
function packByArr($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中的超全局变量
Oct 09 PHP
风格模板初级不完全修改教程
Oct 09 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
Mar 23 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
php中字符串和正则表达式详解
Oct 23 PHP
PHP制作百度词典查词采集器
Jan 29 PHP
Yii中CGridView实现批量删除的方法
Dec 28 PHP
php图片添加文字水印实现代码
Mar 15 PHP
PHP学习笔记之php文件操作
Jun 03 PHP
深入PHP数据加密详解
Jun 18 #PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 #PHP
php多个字符串替换成同一个的解决方法
Jun 18 #PHP
基于PHP读取csv文件内容的详解
Jun 18 #PHP
解析CodeIgniter自定义配置文件
Jun 18 #PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 #PHP
深入array multisort排序原理的详解
Jun 18 #PHP
You might like
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
onpropertypchange
2006/07/01 Javascript
JavaScript触发器详解
2007/03/10 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
python 字符串常用方法汇总详解
2019/09/16 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
工程监理应届生求职信
2013/11/09 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
二手房购房意向书范本
2014/04/01 职场文书
教师师德师风整改措施
2014/10/24 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
项目验收申请报告
2015/05/15 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
课程设计感想范文
2015/08/11 职场文书
python编写函数注意事项总结
2021/03/29 Python