2016-03-18 2 views
5

私のデータにnullバイトの\0が追加されている2つのケースがありました。なぜvar_dumpにnullバイトが表示されないのですか?

array(1) { [0]=> string(14) "\0myClass\0var" } 

たら、2.暗号化されたデータを復号:

function encrypt_data($data) { 
    return base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH , SALT , $data , MCRYPT_MODE_ECB)); 
} 

function decrypt_data($data) { 
    $data = base64_decode($data); 
    return mcrypt_decrypt(MCRYPT_BLOWFISH , SALT , $data , MCRYPT_MODE_ECB); 
} 

$data = '123456789aasdasd'; 
$edata = encrypt_data($data); 
var_dump(addslashes(decrypt_data($edata))); 

出力:

string(39) "123456789aasdasd\0\0\0\0\0\0\0" 
class myClass { 
    private $var; 
    function __construct() {} 
} 
$myObject = (array) new myClass(); 
var_dump(array_map("addslashes", array_keys($myObject))); 

出力アレイにオブジェクトを1.Casting

しかし、私は決して\0には気づかないでしょう。addslashesの機能はありません。なぜちょうどvar_dump()にそれらが表示されないのですか?たとえば、var_dump("Hello\0 World");は 'Hello World'を出力します。私の意見では、データの悪い表現です。そして私が知る限り、\0バイトはC言語の文字配列(PHPの文字列)の終わりであり、PHPはC言語で実装されています。

+2

'var_dump(" Hello \ 0 World ");' _does_文字を表示します。それはあなたのブラウザでは明らかではありません。コマンドラインからそのコードを試してみましょう。 'string(12)" Hello \ 000 World "を出力として取得します。 – jszobody

+1

MACの '\ php -aには\ 0が見えません。 php> var_dump( "Hello \ 0 World"); 文字列(12) "Hello World" ' –

+0

私はMacでも同様です.'php -a; php> var_dump( "Hello \ 0 World"); string(12) "Hello \ 000 World" 'なぜ異なる結果が出るのかわからない – jszobody

答えて

2

var_dumpはそのまま文字列を出力します。文字列にNULバイトが含まれている場合は、そのままNULバイトが出力されます。問題は、通常、NULバイトがブラウザやコマンドラインまで表示されないことです。

表示される文字列の長さが、表示されている文字の長さと異なることを示しています。 string(42) "abc"にはおそらくかなり多くの「隠れた」文字が含まれています。明らかに、これは、あなたの文字列が長くなるほど、眼球に難しくなります...

var_exportNULバイトと同様のことがはっきりしています。

+0

それは私にとって理にかなっています。 'var_export()' + 'var_dump()'の組み合わせはありますか? –

+0

私が知っているわけではありません。あなたが隠れたキャラクターを扱っているかも知れない場合は、より詳細に調査する必要があります。 – deceze

関連する問題