|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。注意不是“Hypertext Preprocessor”的缩写,这种将名称放到定义中的写法被称作递归缩写。 park,unpark,ord这3个函数,在咱们任务中,用到它们的估量不多。 我在比来一个任务中,由于通信需求用到二进制流,然后接口用php吸收。事先在处置时分,查阅很多材料。由于它们利用的确对照少,也很少伴侣任务中会用到它们。 在任务中,我也逐步懂得到park,unpark,ord关于二进制字节处置的壮大。 上面我一一引见它们。
park,unpark,ord函数利用引见
park函数申明:本函数用来将材料紧缩打包到位的字符串当中。
语法: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 字符到相对地位
unpark函数申明:本函数用来将位的字符串的材料解紧缩
语法:unpack(format,args+)
参数 描写 format 必须。划定在包装数据时所利用的格局。 args+ 可选。划定被包装的一个或多个参数。 参数与park不异。
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",parkByArr($code));
echo $stream,strlen($stream);
复制代码 代码以下:
file_put_contents("c:/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";
}
}
由于用”\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(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;
}
虽说不上很好,但至少一般的数据操作,再在原有的SQL语言的基础上,用得还是可以的。 |
|