なぜそのようなコードはpack('i',6)0を返すことができますか?
すべてのphp.netは、この関数の戻り値について次のように述べています。
データを含むバイナリ文字列を返します。
ここではもう少し具体的にする必要があります。返品タイプは何ですか?これはバイナリ文字列であるため、実際に含まれているものとは異なることがよくあります。
数個のヌルバイト(つまり、value = 0、\0char)で開始できます。このバイトはCや他の言語で文字列の終わりを示すために使用され、echo他の関数はnullバイトに遭遇すると停止するため(マニュアルでは、関数は「バイナリセーフ」であると記載されている場合があります。つまり、nullバイトを文字列とは見なしません。終わり)。
また、印刷できない文字がたくさんあります。それらは通常、ある種の特別な意味を持っています(たとえば、文字7は「ベル」コマンドです。これをシェルに入力して試してみてくださいphp -r 'echo "\7";')。
文字列の内容を確認するには、各文字を16進表現に「変換」します。これに使用できbin2hex()ます。入力文字列の1文字を表すには2文字が必要であることに注意してください。
$ php -r 'var_dump(bin2hex(pack("i",6)));'
string(8) "06000000"
(上記の出力はハードウェアによって異なります。)私の場合、Intelプロセッサを使用しているため、リトルエンディアンpack('i', 6);形式で整数が返されます。
最初のchar()の10進値が6であることがわかり06ます。次に行うことは、通常、これがどの文字に属しているかを調べることです。多くの場合、ASCIIテーブルを使用しても問題ありませんが、Unicodeまたはその他のエンコーディングを使用している場合は、特定の文字が別の意味を持つ可能性があることに注意してください。私のASCIIテーブルによると、それはACK文字です。印刷不可の文字で、制御機能のみあります。
まだ説明されていないのは、これが整数0に変換される理由です。幸い、それは非常に簡単です。文字列を数値にキャストする方法については、PHPのマニュアルページをお読みください。
文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は0(ゼロ)になります。
\6文字は符号でも数字でもないため(文字0〜9は10進数または16\48進\57数)、PHPはゼロを返します。\0x30\0x39