в чем разница между кодированием PHP base64 и *nix base64
PHP base64_encode
возвращает другую строку команде linux base64
.
Почему это так?
PHP:
$ php
<?php
echo base64_encode('test');
?>
dGVzdA==
Linux base64:
$ echo 'test' | base64
dGVzdAo=
6 answers
echo
обычно выводит новый символ строки в конце строки, для подавления которого используется переключатель -n
:
$ echo -n 'test' | base64
dGVzdA==
Аналогично для PHP:
$ php
<?php
echo base64_encode("test\n");
?>
dGVzdAo=
Откройте консоль в своем браузере, введите atob('dGVzdAo=')
:
Http://gyazo.com/68d16f666c394887929408c519ac1b23.png
У вас есть дополнительный символ во входных данных. И это 0x0A
(LF).
Когда я делаю эхо, это дает мне следующее:
MacPro:~ bardiir$ echo 'test'
test
MacPro:~ bardiir$
Я бы предположил, что у вас может быть включенная строка, заканчивающаяся в unix, так как echo, вероятно, добавляет символ новой строки, даже если вы передаете его через кодировку base64.
В linux base64
в конце есть новая строка.
Это потому, что версия Unix кодирует также конец строки.
Чтобы получить аналогичный эффект в PHP, вам придется сделать что-то вроде этого:
echo base64_encode('test'.PHP_EOL);
, который выведет:
dGVzdAo=
Смотрите доказательство здесь: ideone.com/HorVD
РЕДАКТИРОВАТЬ: Как упоминал Чарльз, PHP_EOL
зависит от платформы, поэтому для проверки вышесказанного в Windows вам придется заменить его символом конца строки, подобным Unix:
echo base64_encode("test\n");
То же самое и вышеперечисленным парням.
В mac os X просто проверьте это:
$ echo 'test' | cat -e
test$
Или,
$ echo -n 'test' | cat -e
test
И, что касается команды echo, можно увидеть подсказку: