cuáles son las diferencias entre PHP base64 encode y * nix base64


El base64_encode de PHP devuelve una cadena diferente al comando linux base64. ¿Por qué es esto?

PHP:

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

Linux base64:

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

6 answers

echo por lo general, muestra un nuevo carácter de línea al final de la cadena, para suprimirlo use el interruptor -n:

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

Similar para PHP:

$ php
<?php
echo base64_encode("test\n");
?>
dGVzdAo=
 43
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 09:56:37

Abra la consola en su navegador, escriba atob('dGVzdAo='):

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

Tienes carácter extra en tu entrada. Y eso es 0x0A (LF).

 11
Author: c69,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 09:57:02

Cuando hago un eco me da esto:

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

Supongo que podría tener un final de línea incluido en unix, ya que echo probablemente está añadiendo un carácter de nueva línea, incluso si lo canaliza a la codificación base64.

 9
Author: bardiir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 09:49:54

El linux base64 tiene una nueva línea al final.

 2
Author: konsolenfreddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 09:52:22

Es porque la versión Unix codifica también el final de línea.

Para recibir un efecto similar en PHP tendrás que hacer algo así:

echo base64_encode('test'.PHP_EOL);

Que producirá:

dGVzdAo=

Vea la prueba aquí: ideone.com/HorVD

EDIT: Como Charles mencionó, PHP_EOL es específico de la plataforma, por lo que para verificar lo anterior en Windows tendrá que reemplazarlo con el símbolo de final de línea similar a Unix:

echo base64_encode("test\n");
 2
Author: Tadeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-11 19:20:42

Lo mismo para los chicos de arriba.

En mac os X, solo prueba esto:

$ echo  'test' | cat -e

test$

O

$ echo -n  'test' | cat -e

test

Y, sobre el comando echo, puede ver el consejo:

La opción Echo-e en ubuntu no funciona

 0
Author: liuyu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:08:34