我一直在试图找出如果包/解压的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版本不支持?
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}'");
}
}
}
请注意,这个功能没有实现所有的内容解压类型和仅仅作为一个例子。