手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 免费部署 N8N 的 Zeabur 注册 | 登陆
浏览模式: 标准 | 列表全部文章

php pack()函数详解与示例

pack和unpack在一般的程序中还真的不容易见到,但是如果你用过很久以前的php生成excel你就会知道了。他的excel的头就是pack出来的
最近在尝试与C交互的时候又用上了这玩意,所以不得不再看看。其实就是C要求我一定要有包头。。。其实纯字符串也不错嘛。干嘛非得搞个包头呢?真纠结 .。

手册上有pack与unpack的介绍,但都是英文的。。。
 

  任何一款拥有socket操作能力的语言都有一个专门用于组包的函数,php也不例外!          

   用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下:

   包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容

1.包头的内容是记录帧内容的长度;
2. 加密:0表示不加密,1表示加密;
3. 命令码为服务端命令识别符号;

    一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。
   
    话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。

转摘的参数中文说明:

pack/unpack 的摸板字符字符 含义
a 一个填充空的字节串
A 一个填充空格的字节串
b 一个位串,在每个字节里位的顺序都是升序
B 一个位串,在每个字节里位的顺序都是降序
c 一个有符号 char(8位整数)值
C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
d 本机格式的双精度浮点数
f 本机格式的单精度浮点数
h 一个十六进制串,低四位在前
H 一个十六进制串,高四位在前
i 一个有符号整数值,本机格式
I 一个无符号整数值,本机格式
l 一个有符号长整形,总是 32 位
L 一个无符号长整形,总是 32 位
n 一个 16位短整形,“网络”字节序(大头在前)
N 一个 32 位短整形,“网络”字节序(大头在前)
p 一个指向空结尾的字串的指针
P 一个指向定长字串的指针
q 一个有符号四倍(64位整数)值
Q 一个无符号四倍(64位整数)值
s 一个有符号短整数值,总是 16 位
S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
u 一个无编码的字串
U 一个 Unicode 字符数字
v 一个“VAX”字节序(小头在前)的 16 位短整数
V 一个“VAX”字节序(小头在前)的 32 位短整数
w 一个 BER 压缩的整数
x 一个空字节(向前忽略一个字节)
X 备份一个字节
Z 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置


string pack ( string $format [, mixed $args [, mixed $...]] )

一些规则:
1.每个字母后面都可以跟着一个数字,表示 count(计数),如果 count 是一个 * 表示剩下的所有东西。
2.如果你提供的参数比 $format 要求的少,pack 假设缺的都是空值。如果你提供的参数比 $format 要求的多,那么多余的参数被忽略。

下面还是用例子来说明用法会容易理解一点:
PHP代码
  1. 关于Pack:  
  2.   
  3. 下面的第一部分把数字值包装成字节:  
  4. $out = pack("CCCC", 65, 66, 67, 68);      # $out 等于"ABCD"  
  5. $out = pack("C4", 65, 66, 67, 68);         # 一样的东西  
  6.   
  7. 下面的对 Unicode 的循环字母做同样的事情:  
  8.  $foo = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);  
  9.   
  10. 下面的做类似的事情,增加了一些空:  
  11. $out = pack("CCxxCC", 65, 66, 67, 68);      # $out 等于 "AB\0\0CD"  
  12.   
  13. 打包你的短整数并不意味着你就可移植了:  
  14. $out = pack("s2", 1, 2);          
  15. # 在小头在前的机器上是 "\1\0\2\0"  
  16. # 在大头在前的机器上是 "\0\1\0\2"  
  17.   
  18. 在二进制和十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:  
  19.   $out = pack("B32""...");  
  20.     $out = pack("H8""5065726c");         # 都生成“Perl”  
  21.   
  22. a 域里的长度只应用于一个字串:  
  23.   $out = pack("a4""abcd""x""y""z");      # "abcd"  
  24.   
  25. 要绕开这个限制,使用多倍声明:  
  26.   $out = pack("aaaa",    "abcd""x""y""z");   # "axyz"  
  27.    $out = pack("a" x 4,   "abcd""x""y""z");   # "axyz"  
  28.   
  29. a 格式做空填充:  
  30.   $out = pack("a14""abcdefg");         # " abcdefg\0\0\0\0\0\0"  
  31.   
  32. 关于unpack:  
  33.   
  34. array unpack ( string $format, string $data )  
  35.   
  36. $data = "010000020007";  
  37. unpack("Sint1/Cchar1/Sint2/Cchar2",$data);  
  38.   
  39. ## array('int1'=>1, 'char1'=>'0','int2'=>2,'char2'=>7);  
  40.   
  41. 最后本文开头讲到的协议使用pack/unpack 举例程序代码为 :  
  42.   
  43. $lastact   = pack('SCSa32a32',0x0040, 0x00, 0x0006, $username$passwd );  
  44.   
  45. unpack('Sint1/Cchar1/Sint2/Cchar2/',$lastmessage);  

学习资料:
http://blog.csdn.net/jojobb3138688/archive/2007/05/07/1598609.aspx

我上面的内容来自于:http://blog.sina.com.cn/s/blog_3eba8f1c0100nq9r.html,我现在已经顺利的使用完了。黑黑
还有的参考资料:
http://bbs.phpchina.com/thread-104492-1-1.html
http://hi.baidu.com/chinetman/item/f78a71d847e7d638e2108fda

Tags: pack, unpack

phpstorm的splash screen中换LOGO了

其实,这是一个EAP的splash screen,不知道新版是不是真的会变。所以我贴出来了

更新内容其实很正常,但LOGO就不正常了。。有兴趣就看看,并去下载吧,文中有链接。原文来自:http://blog.jetbrains.com/webide/2012/12/phpstorm-6-eap-build-124-295/

This holiday’s EAP brings a traditional set of improvements. Some highlights are:

  • PHP type inference for ’$var->prop’ and ‘$var['key']‘ expressions (assignments tracking, instanceof and ‘is_bool’-like functions)
  • Code folding in Twig templates for blocks and control structures
  • Textmate bundle support included
  • More details on PHP and Platform changes available in tracker

We are working on improved type inference, composer support and framework integration, although features will take some time to show up.

As usual, bear in mind that you are getting a snapshot of work in progress and product will undergo series of technical and cosmetic changes.

Download PhpStorm 6.0 EAP build 124.295 for your platform from project EAP page. Patch-update is also available.

This is a last build.. of 2012. We are closed for holidays and wish you a happy apocalypse.
Spent your time with pleasure!
-JetBrains Web IDE Team

LOGO在此:
大小: 118.81 K
尺寸: 500 x 375
浏览: 1829 次
点击打开新窗口浏览全图
看看评论里,好象也有人喜欢这个新的splash screen

Tags: phpstorm

陈汉典笑话选

1、为什么大海是蓝色的。因为大海里面有鱼。为什么有鱼就会是蓝色的呢?因为鱼会吐泡泡。为什么鱼会吐泡泡就是蓝色呢?因为吐泡的时候就是:blue,blue,blue

2、维尼熊邀请跳跳虎吃火锅,打一个成语:虎背熊腰(虎被熊邀)

3、为什么X和Z不和Y玩?(一个电影的台词):why so serious。来自蝙蝠侠的小丑

用TimeMachine恢复数据

系统刚刚到手的时候,什么 都没有,怎么办?第二天就要准备开发了。然后要下载一大堆软件?

于是拿原来的机器做了一下备份,很简单:
1、插上USB,打开timemachine,开始备份
2、新机器插上刚刚timemachine的USB移动硬盘,启动的时候按OPTION,选择恢复
3、选择用timemachine恢复旧系统,这时候会搜索移动硬盘。会找到timemachine的内容。如果你有多次备份,请记得选对

重启,一切Over

不过有几件事要记住
1、如果你有分区,那只能恢复主分区。所以我有时候就觉得那第二个分区timemachine还有啥用????
2、在系统正在运行的时候,你的timemachine无法找到另一台机器的备份数据,只有刚刚新机器的备份数据。
3、另外的分区,也很方便,但为了拷贝数据完整,建议cp -R,这样会好一点
4、有些设置无法导过来,忍忍吧。。。

最起码我100多G半个多小时就过来了。。(3.0USB的速度还是不错的。可惜启动的时候用不到3.0)

泪奔啊。终于有了自动调频了

一开机的时候,QQ输入法提示我软件有更新了。所以升级了一下。然后看到了属性设置里有一个:自动调频。。
立刻泪奔,多少年了,提了多少次了。终于有自动调频的功能了。
多少次眼睛闭着打字的时候,直接出来那些奇怪的内容。让人哭笑不得。。。
盲打功能在MAC上简直是不可想象的事情。
大小: 30.52 K
尺寸: 500 x 375
浏览: 1616 次
点击打开新窗口浏览全图
而且,原来,我想打HOHO,结果。。。。自动就将“眯眯”给上屏了。。好几次不得不跟别人解释,我这不是说一些淫词荡语,我只是想打HOHO。然后很多人就鄙视的看着我:解释就是掩饰,我一下子就无语了。