phppack解密,PHPpack和unpack函数详解
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
echo pack("C3",80,72,80);
>
输出:
PHP
例⼦ 2
echo pack("C*",80,72,80);
>
输出:
PHP
unpack
解压缩位字符串资料。
语法: string pack(string format, mixed [args]...);
返回值: 数组
函数种类: 资料处理
内容说明
本函数⽤来将位的字符串的资料解压缩。本函数和 Perl 的同名函数功能⽤法完全相同。参数 format 为压缩的格式,参见 pack 的格式表。
例⼦ 1
$data = "PHP";
print_r(unpack("C*",$data));
>
输出:
Array
(
[1] => 80
[2] => 72
[3] => 80
)
例⼦ 2
$data = "PHP";
print_r(unpack("C*myint",$data));
>
输出:
Array
(
[myint1] => 80
[myint2] => 72
[myint3] => 80
)
例⼦ 3
$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的语法写)
/**
* 这是⼀个测试pack/unpack操作的东西
* @author 张⼼灵
* Email: zhangsilly@gmail
*
* ⼀下⽂件存储如下⼏个字段
* 姓名: 长度 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');
$data = new Person_Data();
$data->openDb('./wps.db');
/
/$data->writeRecord($me);
print_r($data->read(1));
以上⽂件运⾏了两侧,写⼊了两⾏记录,最后我读取第⼆⾏记录(索引⾃然从 1 开始)运⾏⼀切正常:
Array
(
[name] => 张⼼灵
[age] => 23
)
双就⼀个字!
翻译:
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]
php手册官方中文版H - Hex string, high nibble first
H - ⼗六进制字符串,⾼“四位元”[high nibble first]
c - signe
d 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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论