"B"
Perl コードからのこのpack
ステートメントで、 は何をしますか?
$hce_hash=pack('B*', $hce_hash);
PHPに同等の関数はありますか?
他の人が指摘したように、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 進数で問題なく動作します。)
pack 'B*', $s
0
の文字列およびの1
文字列を形成する文字で表されるバイトを返します$s
。の値は$s
、必要に応じて 8 で割り切れる長さになるまでゼロで右詰めされます。
例えば、
pack 'B*', '0100101000110101'
結果は
chr(0b01001010) . chr(0b00110101);