2016-09-13 8 views
4

私はunpack()を使用します。xcode( x)を連結できません - PHP

これは動作します:

$srbytes = "\x80\x3e\x00\x00"; 

$array1 = unpack("v",$srbytes); 

これにはない:エコーと

$num1 = "80" 

$srbytes = "\x".$num1."\x3e\x00\x00"; 

$array1 = unpack("v",$srbytes); 

または

$srbytes = "\x"."80\x3e\x00\x00"; 
$array1 = unpack("v",$srbytes); 

印刷これは最初の完全な文字列ではなく、連結されたものとASCIIの文字を示してい連結された場所を通過するまでのテキストを表示します。

完全な文字列と連結された文字列を比較すると、文字列が同じであるにもかかわらずfalseが表示されますか?あなたが行う時点で"\x" . "80" PHPは、すでに2つの文字列リテラルを持っているので、私は、

+0

デバッグ変数の 'echo'を使用しないでください。それは['var_dump()'](http://php.net/var-dump)のためのものです。例えば、 'var_dump()'は、2つの文字列が比較で等しくない理由について、より有用な情報を与えてくれました。なぜなら、1つの文字列が他の文字列より長く見えるからであり、期待する。 – Sherif

+0

あなたの完全に正しい。情報の余分なビットは束を助けたでしょう。 –

答えて

1

文字拡張が動作しませんを連結しようとしているときに実際に何が起こっているのか

。それは他の何かを意味することを期待することはできませんしかし、これです。

16進数値を連結して展開する代わりに、実際の文字を連結するには、16進数の値をbase10の整数に変換し、それを実際のバイトに変換するchr()に渡します。

$str = ""; 
$num1 = "80"; 
$str .= chr(base_convert($num1, 16, 10)); 
var_dump($str); 

はあなたに与える

あなたは var_dump("\x80\x3e\x00\x00")はあなたに string(4) "�>"を与えている何を得る
 
string(1) "�" 

あなたが実際にあなたが文字列リテラル"\x80\x3e\x00\x00"として定義し、あなたの例では$srbytesの値を見て、PHP double quoted strings offer additional character expansion理由エスケープされた16進数の値をバイトに展開するなどです。ただしvar_dump("\x"."80\x3e\x00\x00")string(7) "\x80>"となります。値"\x"はそれ自体文字通りの文字列"\x"であるためです。だから彼らは同じ値ではありません。

+0

これは完全に機能します。大きな説明私は多くの勉強をしています。 –

1

'literal'文字列を使用する場合は、一重引用符を使用します。あなたの問題は、二重引用符で囲まれたエスケープ文字シーケンスが評価されることです。例:

$srbytes = '\x'.'80\x3e\x00\x00'; 
echo $srbytes; 
// \x80\x3e\x00\x00 
var_dump($srbytes); 
// string(16) "\x80\x3e\x00\x00" 

$srbytes = "\x"."80\x3e\x00\x00"; 
echo $srbytes; 
// \x80> 
var_dump($srbytes); 
//string(7) "\x80>" 

http://php.net/manual/en/language.types.string.php

+0

そうです、 'echo'はnullバイトを表示しません。 'echo'は実際に出力をデバッグするのに非常に悪いツールです。 'echo' /' print'/'print_r'は単純にできない出力を、印字可能で意味のある表現で表現できるので、' var_dump() 'に頼るほうがずっと良いです。文字列の長さなど、値が 'false'または' null'などであることを伝えます。 – Sherif

+0

var_dumpです。同じ結果。編集を参照してください。 –

+0

全く同じ結果ではありません。'string(7)" \ x80> "'は、 '\ x80>'であることをすべて伝えているときに 'echo'ではないという情報を与えています。文字列はちょうど5文字であると思うかもしれません。明らかにそうではありません。 – Sherif

関連する問題