2012-01-11 7 views
24

PHP के base64_encode लिनक्स base64 कमांड के लिए एक अलग स्ट्रिंग लौटा रहा है। यह क्यों है?PHP base64_encode और * nix base64

पीएचपी:

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

लिनक्स बेस 64:

$ echo 'test' | base64 
dGVzdAo= 

उत्तर

41

echo आमतौर पर स्ट्रिंग के अंत में एक नई लाइन चरित्र आउटपुट, कि -n स्विच का उपयोग को दबाने के लिए: PHP के लिए इसी तरह

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

: आपके ब्राउज़र में

$ php 
<?php 
echo base64_encode("test\n"); 
?> 
dGVzdAo= 
+0

बिल्कुल सही, धन्यवाद! – psynnott

+0

+1 के लिए +1 - यह मेरे लिए एक नया है –

+2

+1 मुझे ''atob'] (https://developer.mozilla.org/en/DOM/window) के लिए echo – Peter

9

एक गूंज कर जब यह मुझे देता है यह:

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

मुझे लगता है कि चाहते हैं कि आप एक लाइन- शामिल हो सकता है यूनिक्स के रूप में यूनिक्स में समाप्त होने पर शायद एक न्यूलाइन कैरेक्टर संलग्न हो रहा है भले ही आप इसे बेस 64 एन्कोड पर पाइप करते हैं।

+1

सही स्पष्टीकरण, धन्यवाद, लेकिन मैं knittl के समाधान देने जा रहा हूं क्योंकि उसने "-n" का कामकाज दिया था। – psynnott

+0

निश्चित रूप से, मेरे लिए भी एक नया था :) – bardiir

11

खुला कंसोल, टाइप atob('dGVzdAo='):

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

आपके इनपुट में आपके अतिरिक्त चरित्र हैं। और वह 0x0A (एलएफ) है।

+4

+1 के बारे में कुछ नया सिखाए जाने के लिए +1। atob), वह मेरे लिए नया था। –

+0

वैसे, यह फ़ंक्शन किसी भी मानक का हिस्सा नहीं है, इसलिए उत्पादन में इसका उपयोग करने के बारे में सोचें –

+0

@ एम 28 ** ऑफटॉप **: यह मानक में है: http://www.whatwg.org/specs/ वेब-एप्स/वर्तमान-काम/मल्टीपाज/webappapis.html # एटोब और आईई के लिए आप उन दो कार्यों के साथ सरल लाइब्रेरी का उपयोग कर सकते हैं (कार्यान्वयन के बहुत सारे मौजूद हैं: [1] (http://closure-library.googlecode.com/svn /docs/closure_goog_crypt_base64.js.source.html), [2] (http://code.google.com/p/stringencoders/source/browse/trunk/javascript/base64.js?r=230), [3] (https://bitbucket.org/davidchambers/base64.js/src), [4] (https://gist.github.com/1284012))। – c69

2

लिनक्स base64 अंत में एक नई लाइन है।

+0

हाँ, बिना गूंज के कारण, धन्यवाद – psynnott

2

ऐसा इसलिए है क्योंकि यूनिक्स संस्करण लाइन के अंत को भी एन्कोड करता है।

PHP में समान प्रभाव प्राप्त करने के लिए आप ऐसा ही कुछ करना होगा:

echo base64_encode('test'.PHP_EOL); 

जो उत्पादन होगा: ideone.com/HorVD

संपादित करें:

dGVzdAo= 

सबूत यहाँ देखें: जैसा चार्ल्स ने उल्लेख किया है, PHP_EOL प्लेटफार्म-विशिष्ट है, इसलिए विंडोज़ पर उपरोक्त जांचने के लिए आप इसे लाइन प्रतीक के यूनिक्स-जैसे अंत के साथ प्रतिस्थापित करने के लिए:

echo base64_encode("test\n"); 
+0

देखें, 'PHP_EOL' * प्लेटफार्म-विशिष्ट * और विंडोज़ पर अलग होगा। – Charles

+0

@ चार्ल्स: धन्यवाद, मैंने आपके नोटिस के साथ अपना जवाब अपडेट किया। हालांकि यह अधिक अर्थपूर्ण होगा, क्योंकि वह लिनक्स के लिनक्स के 'बेस 64' के साथ लाइन के अंत को एन्कोड करता है, और प्लेटफ़ॉर्म के अंत में लाइन का उपयोग करना सबसे उपयुक्त होगा। मुझे आश्चर्य है कि, अगर विंडोज पर कुछ ऐसा संभव है (उदाहरण के लिए, PowerShell का उपयोग कर ?, शायद अलग वाक्यविन्यास के साथ, लेकिन इसके परिणामस्वरूप स्ट्रिंग को लाइन के अंत में संसाधित किया जा रहा है, लेकिन इस बार विंडोज़ 'एक)। – Tadeck

+0

ऐसा लगता है कि [बेस 64ing किया जा सकता है] (http://blogs.msdn.com/b/powershell/archive/2006/04/25/583265.aspx) PowerShell में तारों पर। इस तथ्य से निर्णय लेते हुए कि यह एक विशिष्ट कमांड के आउटपुट के बजाय स्ट्रिंग पर काम कर रहा है, इसके बारे में चिंता करने के लिए * शायद * कोई खतरनाक न्यूलाइन नहीं है। – Charles

0

उपरोक्त लोगों के लिए समान है।

मैक ओएस एक्स में, बस इस परीक्षण:

$ echo 'test' | cat -e 

test$ 

या,

$ echo -n 'test' | cat -e 

test 

और, गूंज आदेश के बारे में, टिप देख सकते हैं:

echo -e option in ubuntu doesn't work

+0

बिल्ली के माध्यम से पाइप करने का क्या कारण है? – psynnott

+0

@psynnott बस 'echo' कमांड के कुछ विवरण दिखाने के लिए। – liuyu

संबंधित मुद्दे