2016-03-18 1 views
5

У меня было 2 случая, когда к моим данным добавляются нулевые байты \0.Почему var_dump не показывает нулевые байты?

1.Casting объект в массив

class myClass { 
    private $var; 
    function __construct() {} 
} 
$myObject = (array) new myClass(); 
var_dump(array_map("addslashes", array_keys($myObject))); 

Выходы:

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" 

Но я бы никогда не заметил \0 с, если нет addslashes функция. Почему только var_dump() не показывает их? var_dump("Hello\0 World");, например, выдает «Hello World». По-моему, плохое представление данных. И насколько я знаю, \0 байт - это конец массива символов (строка в PHP) в C и PHP реализован в C.

+2

'var_dump (« Hello \ 0 World »);' _does_ показать символ. Это ваш браузер, который не дает понять. Попробуйте этот код из командной строки, я получаю 'string (12)« Hello \ 000 World »' как вывод. – jszobody

+1

Не видите \ 0 на MAC 'php -a; php> var_dump ("Hello \ 0 World"); string (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 обычно не отображается ни в чем в браузере или, возможно, даже в командной строке.

Указание на то, что отображаемая длина строки отличается от отображаемой строки. A string(42) "abc", вероятно, имеет довольно много «скрытых» символов в нем. Очевидно, что становится все труднее и труднее наблюдать за тем, как дольше ваша струна получает ...

var_export делает NUL байт и аналогичным гораздо более очевидным.

+0

Это имеет смысл для меня. Есть ли комбинация 'var_export()' + 'var_dump()'? –

+0

Не то, чтобы я знал. Если у вас есть подозрение, что вы можете иметь дело со скрытыми символами, вам придется исследовать более подробно. – deceze