LEN

PACK/UNPACK 解压缩实例
<?php /* * php处理字节码通讯实例分析 刚刚说的pack作用:节省空间...
扫描右侧二维码阅读全文
30
2017/03

PACK/UNPACK 解压缩实例

    <?php
    /*
     * php处理字节码通讯实例分析 刚刚说的pack作用:节省空间、加密格式
     * 下面就这2个做一个实例说明,接口开发要求:
     *  参数 描述 :
     *  用户名 20字节,字符型
     *  密码 10字节,字符型
     *  年龄 1字节,无符char型
     *  出生年月 4字节,整型(19800101)
     *  邮箱 50字节,字符串
     *  各字段间用:"\0"分割 A、PACK封包
     */
    
    $code = array(
        "username" => array("A20", "张三"),
        "pass" => array("A10", "asdf*#1"),
        "age" => array("C", "222"),
        "birthday" => array("I", "19900101"),
        "email" => array("A50", "zhangsan@163.com")
    );
    
    $stream = join("\0", packByArr($code));
    
    echo $stream, strlen($stream);
    
    file_put_contents("./1.txt", $stream);    //将流保存起来便于下面读取
    
    function packByArr($arr)
    {
        $atArr = array();
        foreach ($arr as $k => $v) {
    
            $atArr[] = pack($v[0], $v[1]);
        }
    
        return $atArr;
    }
    
    
    $code = array(
        "username" => array("A20"),
        "pass" => array("A10"),
        "age" => array("C"),
        "birthday" => array("I"),
        "email" => array("A50")
    );
    
    $stream = file_get_contents("./1.txt");
    
    var_dump(unPackByArr($stream, $code));
    
    function unPackByArr($str, $code)
    {
        $Arr = explode("\0", $str);
        $atArr = array();
        $i = 0;
        foreach ($code as $k => $v) {
            list(, $by) = unpack($v[0], $Arr[$i]);
            $atArr[$k] = $by;
            $i++;
        }
    
        return $atArr;
    }

a — 将字符串空白以 NULL 字符填满
A — 将字符串空白以 SPACE 字符 (空格) 填满
h — 16进制字符串,低位在前以半字节为单位
H — 16进制字符串,高位在前以半字节为单位
c — 有符号字符
C — 无符号字符
s — 有符号短整数 (16位,主机字节序)
S — 无符号短整数 (16位,主机字节序)
n — 无符号短整数 (16位, 大端字节序)
v — 无符号短整数 (16位, 小端字节序)
i — 有符号整数 (依赖机器大小及字节序)
I — 无符号整数 (依赖机器大小及字节序)
l — 有符号长整数 (32位,主机字节序)
L — 无符号长整数 (32位,主机字节序)
N — 无符号长整数 (32位, 大端字节序)
V — 无符号长整数 (32位, 小端字节序)
f — 单精度浮点数 (依计算机的范围)
d — 双精度浮点数 (依计算机的范围)
x — 空字节
X — 倒回一位
@ — 填入 NULL 字符到绝对位置
最后修改:2017 年 03 月 30 日 12 : 39 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论