в чем разница между кодированием PHP base64 и *nix base64


PHP base64_encode возвращает другую строку команде linux base64. Почему это так?

PHP:

$ php
<?php
echo base64_encode('test');
?>
dGVzdA==

Linux base64:

$ echo 'test' | base64
dGVzdAo=
Author: Elzo Valugi, 2012-01-11

6 answers

echo обычно выводит новый символ строки в конце строки, для подавления которого используется переключатель -n:

$ echo -n 'test' | base64
dGVzdA==

Аналогично для PHP:

$ php
<?php
echo base64_encode("test\n");
?>
dGVzdAo=
 43
Author: knittl, 2012-01-11 09:56:37

Откройте консоль в своем браузере, введите atob('dGVzdAo='):

Http://gyazo.com/68d16f666c394887929408c519ac1b23.png

У вас есть дополнительный символ во входных данных. И это 0x0A (LF).

 11
Author: c69, 2012-01-11 09:57:02

Когда я делаю эхо, это дает мне следующее:

MacPro:~ bardiir$ echo 'test'
test
MacPro:~ bardiir$ 

Я бы предположил, что у вас может быть включенная строка, заканчивающаяся в unix, так как echo, вероятно, добавляет символ новой строки, даже если вы передаете его через кодировку base64.

 9
Author: bardiir, 2012-01-11 09:49:54

В linux base64 в конце есть новая строка.

 2
Author: konsolenfreddy, 2012-01-11 09:52:22

Это потому, что версия Unix кодирует также конец строки.

Чтобы получить аналогичный эффект в PHP, вам придется сделать что-то вроде этого:

echo base64_encode('test'.PHP_EOL);

, который выведет:

dGVzdAo=

Смотрите доказательство здесь: ideone.com/HorVD

РЕДАКТИРОВАТЬ: Как упоминал Чарльз, PHP_EOL зависит от платформы, поэтому для проверки вышесказанного в Windows вам придется заменить его символом конца строки, подобным Unix:

echo base64_encode("test\n");
 2
Author: Tadeck, 2012-01-11 19:20:42

То же самое и вышеперечисленным парням.

В mac os X просто проверьте это:

$ echo  'test' | cat -e

test$

Или,

$ echo -n  'test' | cat -e

test

И, что касается команды echo, можно увидеть подсказку:

Опция Echo-e в ubuntu не работает

 0
Author: liuyu, 2017-05-23 12:08:34