gpt4 book ai didi

PHP Pack/unpack - 它可以处理可变长度的字符串吗

转载 作者:可可西里 更新时间:2023-11-01 00:48:54 33 4
gpt4 key购买 nike

我一直在试图弄清楚 Pack/Unpack 的 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 代码的作用被描述为:

Combining two pack codes with a slash (/) associates them with a single value from the argument list. In pack, the length of the argument is taken and packed according to the first code while the argument itself is added after being converted with the template code after the slash.

即您可以打包可变长度的字符串,然后在一个步骤中解压缩它们,而不必先计算出字符串的长度,然后将其作为单独的步骤提取。

PHP 手册没有提及此功能,任何尝试将“C/A*”之类的模式插入到解包中都会给我带来错误。这是手册中的疏忽还是 PHP 版本不支持的内容?

最佳答案

不幸的是,PHP 的打包和解包函数不像 Perl 那样提供变量(空终止)字符串的自动打包和解包。

为了适应这个功能,考虑将 unpack 函数包装到一个辅助类中,如下所示:

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 - 它可以处理可变长度的字符串吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632773/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com