在工作中,我也逐渐了解到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 函数使用方法(二进制流接口应用实例)的更多相关文章

  1. 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)

    在工作中,我也逐渐了解到park,unpark,ord对于二进制字节处理的强大. 下面我逐一介绍它们.     park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一 ...

  2. php pack、unpack、ord 函数使用方法

    string pack ( string $format [, mixed $args [, mixed $... ]] ) Pack given arguments into a binary st ...

  3. park、unpark、ord 函数使用方法(转)

    park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收.当时在处理时候,查阅不少资料.因为它们使用确实比较少, ...

  4. 使用MethodType函数将方法绑定到类或实例上

    在开始正文之前,需要了解下Python的绑定方法(bound method)和非绑定方法. 简单做个测试: 定义一个类,类中由实例方法.静态方法和类方法. class ClassA: def inst ...

  5. C++程序设计方法5:接口设计实例

    //例子:旋转方阵填充,要求矩阵大小任意,尺寸在运行时输入 设计思路:从上到下 int main() { cout << "Please input N:"; int ...

  6. PHP: 深入pack/unpack

    https://my.oschina.net/goal/blog/195749 PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性 ...

  7. PHP: 深入pack/unpack 字节序

    http://my.oschina.net/goal/blog/195749?p=1 目录[-] 写在前面的话 什么是字节序 MSB和LSB 大端序 小端序 网络字节序 主机字节序 总结 pack/u ...

  8. [转]PHP: 深入pack/unpack

    From : http://my.oschina.net/goal/blog/195749 http://www.w3school.com.cn/php/func_misc_pack.asp PHP作 ...

  9. python学习交流 - 内置函数使用方法和应用举例

    内置函数 python提供了68个内置函数,在使用过程中用户不再需要定义函数来实现内置函数支持的功能.更重要的是内置函数的算法是经过python作者优化的,并且部分是使用c语言实现,通常来说使用内置函 ...

随机推荐

  1. 盈创动力之 JS校验方法

    var IS_NULL = 128; // 10000000var IS_FULL = 64; // 01000000var IS_HALF = 32; // 00100000var IS_ASCII ...

  2. java运行Linux命令

    <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UT ...

  3. 自建 AppRTC

    自建 AppRTC 字数3158 阅读1718 评论2 喜欢2 AppRTC 是 webrtc 的一个 demo.自建 AppRTC 可以苦其心志劳其筋骨饿其体肤,更重要的是能学会 webrtc 服务 ...

  4. codevs 3269 混合背包(复习混合背包)

    传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #inclu ...

  5. vue.js created函数注意事项

    因为created钩子函数是页面一加载完就会调用的函数,所以如果你想在这个组件拿值或者是赋值,很可能this里面能拿到数据,但是如果你用this.赋值的话,控制台或者debugger都会发现this里 ...

  6. bzoj 4668 冷战——并查集结构

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 不路径压缩,维护并查集的树的结构,查询链上最大值.按秩合并就可以暴爬. #includ ...

  7. map插入与查找

    用map构建映射关系可以用来离散化,这里记录一下用法: 插入:将要插入的两个值组成pair,用insert插入map中: 查找:定义iterator,赋成find返回的迭代器,如果没有找到则=mp.e ...

  8. POJ2752(next原理理解)

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15536   Ac ...

  9. SQL repeat()函数

    转自:https://www.yiibai.com/sql/sql-repeat-function.html REPEAT(str,count) 返回一个字符串组成的字符串STR重复的次数.如果计数小 ...

  10. Bean的不同配置方式比较与应用场景

    基于XML配置 Bean的定义:           在XML文件中通过<bean>元素定义. Bean的名称:           通过<bean>的id或name属性定义. ...