2

"B"Perl コードからのこのpackステートメントで、 は何をしますか?

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

PHPに同等の関数はありますか?

4

3 に答える 3

2

他の人が指摘したように、PHP のpack()Bはテンプレートをサポートしていません。Perl のpack()0では、と文字のリテラル文字列として表されるビット文字列を1、1 バイトあたり 8 ビットのパックされたバイト文字列に変換します。

ただし、PHP の pack() はHテンプレートをサポートしているため、ビットの代わりに 16 進数を除いて同じことを行います。PHP で Perl のBテンプレートをエミュレートするには、最初にbase_convert()を使用してビットを 16 進数に変換し、次にそれらをパックします。

function pack_B( $bits, $len = false ) {
    // truncate input to desired length, if given:
    if ( $len === false ) $len = strlen( $bits );
    else $bits = substr( $bits, 0, $len );

    // pad input with zeros to next multiple of 4 above $len:
    $hexlen = (int)( ($len + 3) / 4 );
    $bits = str_pad( $bits, 4*$hexlen, "0" );

    // split input into chunks of 4 bits, convert each to hex and pack them:
    $nibbles = str_split( $bits, 4 );
    foreach ( $nibbles as $i => $nibble ) {
        $nibbles[$i] = base_convert( $nibble, 2, 16 );
    }
    return pack( "H*", implode( "", $nibbles ) );
}

(入力文字列全体を base_convert() に渡すことができない理由は、中間結果を PHP float として保存するため、大きすぎて float で正確に表現できない数値に対しては正しい結果が生成されないためです。ただし、一度に 1 桁の 16 進数で問題なく動作します。)

于 2013-03-07T19:39:33.543 に答える
2

pack 'B*', $s0の文字列およびの1文字列を形成する文字で表されるバイトを返します$s。の値は$s、必要に応じて 8 で割り切れる長さになるまでゼロで右詰めされます。

例えば、

pack 'B*', '0100101000110101'

結果は

chr(0b01001010) . chr(0b00110101);
于 2013-03-07T16:23:14.717 に答える