2009-03-10 29 views
11

विंडोज पर पायथन का उपयोग करके आप एक पीएनजी छवि को बेस 64 में कैसे एन्कोड करते हैं?विंडोज़ पर पाइथन में बेस 64 पीएनजी

iconfile = open("icon.png") 
icondata = iconfile.read() 
icondata = base64.b64encode(icondata) 

उपरोक्त काम लिनक्स और ओएसएक्स में ठीक काम करता है, लेकिन विंडोज़ पर यह पहले कुछ पात्रों को एन्कोड करेगा और फिर छोटा कर देगा। ऐसा क्यों है?

उत्तर

26

Open the file in binary mode:

open("icon.png", "rb") 

मैं Windows साथ बहुत परिचित नहीं हूँ, लेकिन मैं कल्पना करता क्या हो रहा है कि फ़ाइल एक चरित्र (0x1A) कि Windows is interpreting as the end of the file (विरासत कारणों के लिए) जब इसे खोला है शामिल है पाठ मोड में। दूसरा मुद्दा यह है कि विंडोज़ पर टेक्स्ट मोड ('बी' के बिना) में फ़ाइल खोलने से लाइन एंडिंग को फिर से लिखा जा सकता है, जो आम तौर पर बाइनरी फाइलों को तोड़ देगा जहां वे पात्र वास्तव में लाइन के अंत को इंगित नहीं करते हैं।

+0

+1 क्योंकि यह काम करता है। – Brian

+0

वह वास्तव में सही है, यह अजीब है कि यह लिनक्स/ओएसएक्स – directedition

+0

लिनस/ओएसएक्स का इलाज बाइनरी और टेक्स्ट फाइलों के बिना ठीक कैसे काम करता है, जबकि विंडोज़ कैरीज़ को बाइनरी फाइलों में टेक्स्ट फाइलों में अलग-अलग काम करता है। साथ ही, आपको सही उत्तर के रूप में चिह्नित करने के लिए उसके उत्तर के बगल में स्थित चेकबॉक्स पर क्लिक करना चाहिए। – Powerlord

9

मीलों से जवाब बढ़ाने के लिए, first eight bytes in a PNG file विशेष रूप से डिजाइन किया गया है:

  • 89 - किसी को पढ़ने देती हैं - पहली बाइट एक चेक कि बिट 8
  • "पीएनजी" छीन नहीं किया गया है डॉस के अंत फ़ाइल चार - डॉस अंत लाइन सूचक है, अगर वहाँ था DOS-> यूनिक्स रूपांतरण
  • 1 क जांच करने के लिए - यह एक PNG प्रारूप
  • 0 दि 0A है कि Acter, जाँच करने के लिए है कि फाइल द्विआधारी मोड
  • 0A में खोला गया था - यूनिक्स अंत लाइन चरित्र जांच करने के लिए, अगर वहाँ एक यूनिक्स> डॉस रूपांतरण

आपका कोड पर बंद हो जाता था 1 ए, डिजाइन के रूप में।

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