gpt4 book ai didi

php - Perl pack() 函数和 "B"格式化字符到 Php

转载 作者:行者123 更新时间:2023-12-04 16:44:47 25 4
gpt4 key购买 nike

Perl 代码中的 "B" 在这个 pack 语句中做了什么?

$hce_hash=pack('B*', $hce_hash);

PHP 中是否有等效的函数?

最佳答案

PHP 的 pack不支持 B* 格式,但支持 H*。在 Perl 中,您可以使用

sub pack_Bstar {
my($bits) = @_;
my $Hstar;

my $nybble = 0;
for (my $i = 0; $i < length $bits; ++$i) {
$nybble *= 2;
$nybble += int substr($bits, $i, 1);
if ($i % 4 == 3) {
$Hstar .= sprintf "%x", $nybble;
$nybble = 0;
}
}

my $pad = 4 - length($bits) % 4;
if ($pad != 4) {
$nybble = ($nybble << $pad);
$Hstar .= sprintf "%x", $nybble;
}

pack "H*", $Hstar;
}

上面的代码不是惯用的 Perl,但翻译成 PHP 应该很简单。

H* 格式首先需要一个带有高字节(4 位)的十六进制字符串。上面的代码一次咀嚼四位来计算每个 nybble 值。例如,对于 1011 的位串,跟踪算法给出

  1. nybble = 0
  2. nybble = 2 * 0 + 1 = 1
  3. nybble = 2 * 1 + 0 = 2
  4. nybble = 2 * 2 + 1 = 5
  5. nybble = 2 * 5 + 1 = 11

10112确实是1110,也就是b16。如果最后一个 nybble 不完整(在一到三位之间),我们将该位左移适当的位置。这具有右侧零填充的效果。

测试:

my @tests = (
["01001010011101010111001101110100" => "Just"],
["0110000101101110011011110111010001101000011001010111001" => "another"],
["01010000010010000101000000101111010100000110010101110010011011" => "PHP/Perl"],
["01101000011000010110001101101011011001010111001000101100" => "hacker,"],
);

for (@tests) {
my($input,$expect) = @$_;
my $got = pack_Bstar $input;
print "$input: ", ($got eq $expect ? "PASS" : "FAIL"), " ($got)\n";
}

输出:

01001010011101010111001101110100: PASS (Just)0110000101101110011011110111010001101000011001010111001: PASS (another)01010000010010000101000000101111010100000110010101110010011011: PASS (PHP/Perl)01101000011000010110001101101011011001010111001000101100: PASS (hacker,)

关于php - Perl pack() 函数和 "B"格式化字符到 Php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273953/

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