PHP包/解包 - 它可以处理可变长度的字符串(PHP Pack/unpack - can it h

2019-06-26 12:42发布

我一直在试图找出如果包/解压的PHP实现可以做一些事情,Perl的版本是能够做到的。 这个例子我希望能在PHP是做:

http://perldoc.perl.org/perlpacktut.html#String-Lengths

# pack a message: ASCIIZ, ASCIIZ, length/string, byte
my $msg = pack( 'Z* Z* C/A* C', $src, $dst, $sm, $prio );
# unpack
( $src, $dst, $sm, $prio ) = unpack( 'Z* Z* C/A* C', $msg );

这是什么Perl代码也被描述为:

用斜线(/)组合两个包码将它们与从参数列表中的单个值相关联。 在组中,参数的长度被取和包装根据第一代码,而参数本身被转换与所述斜线后的模板代码之后加入。

即可以包的可变长度字符串,然后解压它们在一个步骤,而不必首先弄清楚字符串的长度,然后提取它作为一个单独的步骤。

PHP手册中没有提到这个能力和任何企图插入像“C / A *”变成解压是给错误给我的模式。 那是在手册中的监督或只是一些PHP版本不支持?

Answer 1:

PHP包并解压功能,遗憾的是没有提供自动打包和拆包变量(空值终止)的字符串如Perl。

为了适应这一功能,可考虑包解包功能为辅助类是这样的:

class Packer {
    static function unpack($mask, $data, &$pos) {
        try {
            $result = array();
            $pos = 0;
            foreach($mask as $field) {
                $subject = substr($data, $pos);
                $type = $field[0];
                $name = $field[1];
                switch($type) {
                    case 'N':
                    case 'n':
                    case 'C':
                    case 'c':
                        $temp = unpack("{$type}temp", $subject);
                        $result[$name] = $temp['temp'];
                        if($type=='N') {
                            $result[$name] = (int)$result[$name];
                        }

                        $pos += ($type=='N' ? 4 : ($type=='n' ? 2 : 1));
                        break;
                    case 'a':
                        $nullPos = strpos($subject, "\0") + 1;
                        $temp = unpack("a{$nullPos}temp", $subject);
                        $result[$name] = $temp['temp'];
                        $pos += $nullPos;
                        break;
                }
            }
            return $result;
        } catch(Exception $e) {
            $message = $e->getMessage();
            throw new Exception("unpack failed with error '{$message}'");
        }
    }
}

请注意,这个功能没有实现所有的内容解压类型和仅仅作为一个例子。



文章来源: PHP Pack/unpack - can it handle variable length strings
标签: php pack unpack