$x = sprintf( "foo\x00bar\x00baz" );
$y = unpack( 'afoo/abar/abaz' , $x );
print_r( $y );
Run Code Online (Sandbox Code Playgroud)
$x = sprintf( "foo\x00bar\x00baz" );
$y = unpack( 'a*foo/a*bar/a*baz' , $x );
print_r( $y );
Run Code Online (Sandbox Code Playgroud)
Array
(
[foo] => f
[bar] => o
[baz] => o
)
Array
(
[foo] => foobarbaz
[bar] =>
[baz] =>
)
请注意,NULL字节始终存在,您可以使用它进行检查hexdump.
Array
(
[foo] => foo
[bar] => bar
[baz] => baz
)
我知道我可以explode用来达到类似的效果.我不是要求替代方案,我只是想了解a格式字符背后的逻辑(正如文档所说的那样"NUL-padded string").
"NULL"值在哪里参与了所有这些?
"所有这些都涉及到"NULL"值在哪里?"
无处.
我很确定PHP pack()/ unpack()的文档需要更新.基本上,只要你看到它引用了一个以NULL结尾的字符串,那么该文档就是从代码的Perl版本中获取的,并不反映PHP中发生的事情.
基本上Perl有C样式字符串,可以为空终止,以便您知道字符串结尾的位置.在PHP中,没有NULL字符的概念.例如
$test1 = "Test".NULL."ing";
$test2 = "Testing";
if(strcmp($test1, $test2) == 0){
echo "The strings are the same";
}
else{
echo "They are different.";
}
Run Code Online (Sandbox Code Playgroud)
将打印'字符串是相同的'.
顺便说一下:"foo\x00bar\x00baz"
可能没有做你认为它正在做的事情.它没有在foo + bar和bar + baz之间的字符串中放置'NULL'字符,因为没有NULL字符.相反,它将字符'0',恰好在大多数字符集中打印出来,但作为一个字符没有特殊含义.
我知道你提到使用explode而不是unpack但是如果你知道字符串长度那么你可以使用:
unpack( 'a3foo/a3bar/a3baz' , $binarydata);
Run Code Online (Sandbox Code Playgroud)
赛勒斯写道:
"NULL byte"是指值为0的字节:
我不知道你在哪里得到字符串"foo\x00bar\x00baz"但是:
i)它必须来自支持由零表示的NULL字符的语言.PHP不支持NULL字符,如果你调用pack("A*A*A*","foo","bar","baz"); 它不会生成带有零的字符串.
ii)解压缩的PHP版本不支持NULL字符(因为PHP不支持NULL字符),并将十六进制值为0的字符视为另一个字符.例如
function strToHex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++)
{
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
$binarydata = "foo\x00bar\x00baz";
echo "binarydata is ";
var_dump($binarydata);
$y = unpack( 'a3foo/a3bar/a3baz' , $binarydata);
var_dump( $y );
echo strToHex($y['foo'])."\r\n";
echo strToHex($y['bar'])."\r\n";
echo strToHex($y['baz'])."\r\n";
Run Code Online (Sandbox Code Playgroud)
将输出:
binarydata is string(11) "foobarbaz"
array(3) {
["foo"]=>
string(3) "foo"
["bar"]=>
string(3) "ba"
["baz"]=>
string(3) "rb"
}
666f6f
06261
72062
Run Code Online (Sandbox Code Playgroud)
即它提取前三个字符,值为0x66,0x6f,0x6f.然后它提取接下来的三个字符,即0x0,0x62,0x61.最后,它提取值0x72,0x0,0x62.
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |