pack

压缩资料到位字符串之中。

语法: string pack(string format, mixed [args]...);

返回值: 字符串

函数种类: 资料处理

内容说明

本函数用来将资料压缩打包到位的字符串之中。本函数和 Perl 的同名函数功能用法完全相同。

参数 format 为压缩的格式,见下表

a            将字符串空白以 NULL 字符填满

A            将字符串空白以 SPACE 字符 (空格) 填满

h            十六进位字符串,低位在前

H            十六进位字符串,高位在前

c            有号字符

C            无号字符

s            有号短整数 (十六位,依计算机的位顺序)

S            无号短整数 (十六位,依计算机的位顺序)

n            无号短整数 (十六位, 高位在后的顺序)

v            无号短整数 (十六位, 低位在后的顺序)

i            有号整数 (依计算机的顺序及范围)

I            无号整数 (依计算机的顺序及范围)

l            有号长整数 (卅二位,依计算机的位顺序)

L            无号长整数 (卅二位,依计算机的位顺序)

N            无号短整数 (卅二位, 高位在后的顺序)

V            无号短整数 (卅二位, 低位在后的顺序)

f            单精确浮点数 (依计算机的范围)

d            倍精确浮点数 (依计算机的范围)

x            空位

X            倒回一位

@            填入 NULL 字符到绝对位置

例子 1

<?php

echo pack("C3",80,72,80);

?>

输出:

PHP

例子 2

<?php

echo pack("C*",80,72,80);

?>

输出:

PHP

unpack

解压缩位字符串资料。

语法: string pack(string format, mixed [args]...);

返回值: 数组

函数种类: 资料处理

内容说明

本函数用来将位的字符串的资料解压缩。本函数和 Perl 的同名函数功能用法完全相同。参数 format 为压缩的格式,参见 pack 的格式表。

例子 1

<?php

$data = "PHP";

print_r(unpack("C*",$data));

?>

输出:

Array

(

[1] => 80

[2] => 72

[3] => 80

)

例子 2

<?php

$data = "PHP";

print_r(unpack("C*myint",$data));

?>

输出:

Array

(

[myint1] => 80

[myint2] => 72

[myint3] => 80

)

例子 3

<?php

$bin = pack("c2n2",0x1234,0x5678,65,66);

print_r(unpack("c2chars/n2int",$bin));

?>

输出:

Array

(

[chars1] => 52

[chars2] => 120

[int1] => 65

[int2] => 66

)

玩了玩 PHP 的 pack/unpack !还是蛮简单的

2007-07-04 16:34

这几天要做双向的加解密,因为加密后的结果都是二进制的,不得不了解一下它了

小try了一把pack/unpack,基本用法还是蛮简单的,下面的例子基本上是给了个做数据库的原型(嘻嘻,不能用PHP5了,只好用PHP4的语法写)

<?php

/**

* 这是一个测试pack/unpack操作的东西

* @author 张心灵

* Email: zhangsilly@gmail.com

*

* 一下文件存储如下几个字段

* 姓名: 长度 8 字节

* 年龄: unsigned int

* Email: 长度 30 字节

*/

class Person_Data

{

/**

* 数据库文件路径

*

* @var string

*/

var $_database = './wps.db';

/**

* 打开一个数据库文件

*

* @param string $file      数据库文件名

*/

function openDb($file = './wps.db')

{

$this->_database = $file;

$this->_database = fopen($this->_database, 'ab+');

}

/**

* 向数据库中写入一条记录

*

* @param array $data     PHP4真的丑死了

* @return void

*/

function writeRecord($data)

{

$name = pack('a8', $data['name']);

$age = pack('S', $data['age']);

$email = pack('a30', $data['email']);

fwrite($this->_database, $name . $age . $email);

}

/**

* 读取一条记录

*

* @param int $count optional default to 0    记录id数

* @return array

*/

function read($count = 0)

{

rewind($this->_database);

fseek($this->_database, 40 * $count);

$return = array();

$return['name'] = unpack('a8', fread($this->_database, 8));

$return['name'] = $return['name'][1];

$return['age'] = unpack('S', fread($this->_database, 2));

$return['age'] = $return['age'][1];

$return['email'] = unpack('a30', fread($this->_database, 30));

$return['email'] = $return['email'][1];

return $return;

}

}

$me = array(      'name' => '张心灵',

'age'    => 23,

'email' => 'zhangsilly@gmail.com');

$data = new Person_Data();

$data->openDb('./wps.db');

//$data->writeRecord($me);

print_r($data->read(1));

以上文件运行了两侧,写入了两行记录,最后我读取第二行记录(索引自然从 1 开始)

运行一切正常:

Array

(

[name] => 张心灵

[age] => 23

[email] => zhangsilly@gmail.com

)

双就一个字!

翻译:

pack()函数的作用是:将数据压缩成一个二进制字符串。

  • a - NUL-padded string

    a - NUL- 字符串填满[padded string]

  • A - SPACE-padded string    

    A - SPACE- 字符串填满[padded string]

  • h - Hex string, low nibble first    

    h – 十六进制字符串,低“四位元”[low nibble first]

  • H - Hex string, high nibble first    

    H - 十六进制字符串,高“四位元”[high nibble first]

  • c - signed char    

    c – 带有符号的字符

  • C - unsigned char    

    C – 不带有符号的字符

  • s - signed short (always 16 bit, machine byte order)    

    s – 带有符号的短模式[short](通常是16位,按机器字节顺序)

  • S - unsigned short (always 16 bit, machine byte order)    

    S – 不带有符号的短模式[short](通常是16位,按机器字节排序)

  • n - unsigned short (always 16 bit, big endian byte order)    

    n -不带有符号的短模式[short](通常是16位,按大endian字节排序)

  • v - unsigned short (always 16 bit, little endian byte order)    

    v -不带有符号的短模式[short](通常是16位,按小endian字节排序)

  • i - signed integer (machine dependent size and byte order)    

    i – 带有符号的整数(由大小和字节顺序决定)

  • I - unsigned integer (machine dependent size and byte order)    

    I – 不带有符号的整数(由大小和字节顺序决定)

  • l - signed long (always 32 bit, machine byte order)    

    l– 带有符号的长模式[long](通常是32位,按机器字节顺序)

  • L - unsigned long (always 32 bit, machine byte order)    

    L – 不带有符号的长模式[long](通常是32位,按机器字节顺序)

  • N - unsigned long (always 32 bit, big endian byte order)    

    N – 不带有符号的长模式[long](通常是32位,按大edian字节顺序)

  • V - unsigned long (always 32 bit, little endian byte order)    

    V– 不带有符号的长模式[long](通常是32位,按小edian字节顺序)

  • f - float (machine dependent size and representation)    

    f –浮点(由大小和字节顺序决定)

  • d - double (machine dependent size and representation)    

    d – 双精度(由大小和字节顺序决定)

  • x - NUL byte    

    x – 空字节[NUL byte]

  • X - Back up one byte    

    X- 后面一个字节[Back up one byte]

  • @ - NUL-fill to absolute position    

    @ - NUL- 添加到一个绝对位置[absolute position]

php里的pack及unpack--转

2009-03-15 22:11

用了很久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 要求的多,那么多余的参数被忽略。

下面还是用例子来说明用法会容易理解一点:

关于Pack:

下面的第一部分把数字值包装成字节:

$out = pack("CCCC", 65, 66, 67, 68);       # $out 等于"ABCD"

$out = pack("C4", 65, 66, 67, 68);          # 一样的东西

下面的对 Unicode 的循环字母做同样的事情:

$foo = pack("U4", 0x24b6, 0x24b7, 0x24b8, 0x24b9);

下面的做类似的事情,增加了一些空:

$out = pack("CCxxCC", 65, 66, 67, 68);       # $out 等于 "AB\0\0CD"

打包你的短整数并不意味着你就可移植了:

$out = pack("s2", 1, 2);

# 在小头在前的机器上是 "\1\0\2\0"

# 在大头在前的机器上是 "\0\1\0\2"

在二进制和十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:

$out = pack("B32", "...");

$out = pack("H8", "5065726c");          # 都生成“Perl”

a 域里的长度只应用于一个字串:

$out = pack("a4", "abcd", "x", "y", "z");       # "abcd"

要绕开这个限制,使用多倍声明:

$out = pack("aaaa",     "abcd", "x", "y", "z");    # "axyz"

$out = pack("a" x 4,    "abcd", "x", "y", "z");    # "axyz"

a 格式做空填充:

$out = pack("a14", "abcdefg");          # " abcdefg\0\0\0\0\0\0"

关于unpack:

array unpack ( string $format, string $data )

$data = "010000020007";

unpack("Sint1/Cchar1/Sint2/Cchar2",$data);

## array('int1'=&gt;1, 'char1'=&gt;'0','int2'=&gt;2,'char2'=&gt;7);

最后本文开头讲到的协议使用pack/unpack 举例程序代码为 :

$lastact    = pack('SCSa32a32',0x0040, 0x00, 0x0006, $username, $passwd );

unpack('Sint1/Cchar1/Sint2/Cchar2/',$lastmessage);

PHP pack和unpack函数详解的更多相关文章

  1. python3 内置函数详解

    内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小. >>> abs(-25) 25 >&g ...

  2. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  3. NSSearchPathForDirectoriesInDomains函数详解

    NSSearchPathForDirectoriesInDomains函数详解     #import "NSString+FilePath.h" @implementation ...

  4. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  5. Linux C popen()函数详解

    表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...

  6. kzalloc 函数详解(转载)

    用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. view plain /** * kzal ...

  7. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  8. jQuery.attr() 函数详解

    一,jQuery.attr()  函数详解: http://www.365mini.com/page/jquery-attr.htm 二,jQuery函数attr()和prop()的区别: http: ...

  9. memset函数详解

    语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关  功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...

随机推荐

  1. 通过命令打包apk

    平时使用android studio打包,方便快捷,对命令不太熟悉,但在上传apk包到应用市场时,需要认领apk,“认领页的[选择APK]”不是上传您要更新的APK应用文件,而是下载我们提供的空包文件 ...

  2. extjs4 treepanel 多个checkbox先中 多个节点选中 多级节点展开

    //<%@ page contentType="text/html; charset=utf-8" %> var checkedNodes = { _data:{}, ...

  3. AIM Tech Round (Div. 2) C. Graph and String

    C. Graph and String time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. HDU 5627Clarke and MST

    Clarke and MST Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  5. local_irq_disable

    local_irq_disable 仅仅是 设置 当前CPU 的中断屏蔽位 disable_irq 是禁用 全部cpu 中断(只是当前irq) 如果你要禁止所有的中断该怎么办? 在2.6内核中,可以通 ...

  6. 修改u-boot的开机logo及显示过程【转】

    本文转载自;http://blog.csdn.net/voice_shen/article/details/6789424 [ u-boot: Git://git.denx.de/u-boot.git ...

  7. POJ1797 Heavy Transportation —— 最短路变形

    题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K T ...

  8. 跳转到AppStore 的不同位置办法

    程序跳转到appstore中指定的应用 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat:                    ...

  9. 【Java】通过移除空行和注释来压缩 JavaScript 代码

    1. [代码]JavaScriptCompressor.java/** * This file is part of the Echo Web Application Framework (herei ...

  10. POJ2976:Dropping tests(01分数规划入门)

    In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cum ...