php pack、unpack、ord 函数使用方法(二进制流接口应用实例)
在工作中,我也逐渐了解到pack,unpack,ord对于二进制字节处理的强大。 下面我逐一介绍它们。在我们工作中,用到它们的估计不多。 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收。当时在处理时候,查阅不少资料。因为它们使用确实比较少,也很少朋友工作中会用到它们。 在工作中,我也逐渐了解到pack,unpack,ord对于二进制字节处理的强大。 下面我逐一介绍它们。
pacrk函数说明:本函数用来将资料压缩打包到位的字符串之中。
语法: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);
实例说明:
//A字符
$str = (pack ( "A*", "中国" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //H字符
$str = (pack ( "H*", "fffe" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //C字符
$str = (pack ( "C*", "55", "56", "57" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //i字符 短整形 32位 4个字节 64位8个字节
$str = (pack ( "i", "100" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //s字符 短整形 2个字节
$str = (pack ( "s", "100" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //l字符 长整形 4个字节
$str = (pack ( "l", "100" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //f字符 单精度浮点 4个字节
$str = (pack ( "f", "100" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; //d字符 双精度浮点 8个字节
$str = (pack ( "d", "100" ));
echo $str, "=", strlen ( $str ), "字节\n";
getAscill ( $str );
echo '<br/>'; 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封包
$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解包
解包需要按照,打包方式读取,该读取多长,该用什么类型读取,必须与打包规定一样。
$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 pack、unpack、ord 函数使用方法(二进制流接口应用实例)的更多相关文章
- 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)
在工作中,我也逐渐了解到park,unpark,ord对于二进制字节处理的强大. 下面我逐一介绍它们. park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一 ...
- php pack、unpack、ord 函数使用方法
string pack ( string $format [, mixed $args [, mixed $... ]] ) Pack given arguments into a binary st ...
- park、unpark、ord 函数使用方法(转)
park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收.当时在处理时候,查阅不少资料.因为它们使用确实比较少, ...
- 使用MethodType函数将方法绑定到类或实例上
在开始正文之前,需要了解下Python的绑定方法(bound method)和非绑定方法. 简单做个测试: 定义一个类,类中由实例方法.静态方法和类方法. class ClassA: def inst ...
- C++程序设计方法5:接口设计实例
//例子:旋转方阵填充,要求矩阵大小任意,尺寸在运行时输入 设计思路:从上到下 int main() { cout << "Please input N:"; int ...
- PHP: 深入pack/unpack
https://my.oschina.net/goal/blog/195749 PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性 ...
- PHP: 深入pack/unpack 字节序
http://my.oschina.net/goal/blog/195749?p=1 目录[-] 写在前面的话 什么是字节序 MSB和LSB 大端序 小端序 网络字节序 主机字节序 总结 pack/u ...
- [转]PHP: 深入pack/unpack
From : http://my.oschina.net/goal/blog/195749 http://www.w3school.com.cn/php/func_misc_pack.asp PHP作 ...
- python学习交流 - 内置函数使用方法和应用举例
内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...
随机推荐
- adb pull / push
刚才搞了半天想pull,就是pull不成,如图: 看出哪里有问题了吗? 问题就是我不该在shell里面运行adb pull! 正确的做法: 在任意一处打开命令行比如图中的桌面, adb pull /s ...
- ubuntu bcompare 安装
Terminal Install wget http://www.scootersoftware.com/bcompare-4.2.8.23479_amd64.deb sudo apt-get upd ...
- opencv 知识点笔记
1.Opencv中cvScalar是CV_RGB的宏,cvScalar的储存顺序是B-G-R,而CV_RGB的储存顺序是R-G-B
- 单例模式-Lazy initialization holder class模式
这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识,很巧妙地同时实现了延迟加载和线程安全. 1.相应的基础知识 什么是类级内部类? 简单点说,类级内部类指的是,有static修饰的成员式内 ...
- 1.1- 1.2 hive入门
一.hive是什么 由Facebook开源用于解决海量结构化日志的数据统计: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表, 并提供类SQL查询功能: 构建在Had ...
- (水题)Codeforces - 4C - Registration system
https://codeforces.com/problemset/problem/4/C 用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间. ...
- lightoj 1096【矩阵快速幂(作为以后的模板)】
基础矩阵快速幂何必看题解 #include <bits/stdc++.h> using namespace std; /* 0 1 2 3 4 5 6 7 0 0 0 */ const i ...
- Unity Mecanim在大型mmo中的应用
http://blog.csdn.net/langresser_king/article/details/37760091?utm_source=tuicool&utm_medium=refe ...
- Cocos2d-x-html5之HelloWorld深入分析与调试
Cocos2d-x-html5之HelloWorld深入分析与调试 另:本章所用Cocos2d-x版本为: Cocos2d-html5-v2.1.1 http://cn.cocos2d-x.org/d ...
- [Xcode 实际操作]八、网络与多线程-(1)使用Reachability类库检测网络的连接状态
目录:[Swift]Xcode实际操作 本文将演示如何使用Reachability网络状态检测库,检测设备的网络连接状态. 需要下载一个开源的类库:[ashleymills/Reachability. ...