2015-03-19 12 views
5

में बाइनरी के रूप में एक ASCII स्ट्रिंग लिखना मेरे पास ASCII स्ट्रिंग = "abcdefghijk" है। मैं इसे पाइथन का उपयोग करके बाइनरी प्रारूप में बाइनरी फ़ाइल में लिखना चाहता हूं।पाइथन

मैं निम्नलिखित की कोशिश की:

str = "abcdefghijk" 
fp = file("test.bin", "wb") 
hexStr = "".join((("\\x%s") % (x.encode("hex"))) for x in str) 
fp.write(hexStr) 
fp.close() 

हालांकि, जब मैं test.bin मैं ascii प्रारूप के बजाय बाइनरी में निम्न देखें खोलें।

\x61\x62\x63\x64\x65\x66\x67 

मैं इसे समझता हूं क्योंकि यहां दो स्लेश ("\\ x% s") के लिए। मैं इस मुद्दे को कैसे हल कर सकता हूं? अग्रिम में धन्यवाद।

अद्यतन:

के बाद मुझे उम्मीद परिणाम देता है:

file = open("test.bin", "wb") 
file.write("\x61\x62\x63\x64\x65\x66\x67") 
file.close() 

लेकिन मैं कैसे "abcdef" ASCII तार के साथ इस लक्ष्य को हासिल है। ?

+0

आप * बहुत सावधानी से * अक्षरों को हेक्स के रूप में एन्कोड करते हैं - आप कुछ और क्यों देखने की उम्मीद कर रहे हैं? – jonrsharpe

+0

तब आप किस आउटपुट की अपेक्षा करते थे? मुझे यकीन नहीं है कि आप समझ गए हैं कि बाइनरी मोड * क्या करता है, या यहां तक ​​कि पाइथन भी \ \ xhh' नोटेशन का उपयोग करता है (और यह केवल * वाक्यविन्यास * है, एक मूल्य उत्पन्न करने का एक तरीका है, मूल्य नहीं है)। –

+0

@jonrsharpe, मैं test.bin (ascii स्ट्रिंग के रूप में नहीं) के लिए बाइनरी के रूप में "\ x61 \ x62 \ x63 \ x64 \ x65 \ x66 \ x67" लिखना चाहता हूं। मैं उसे कैसे कर सकता हूँ? और अंत में test.bin एक बाइनरी फ़ाइल होना चाहिए। – aMa

उत्तर

6

को आप गलत समझा क्या \xhh अजगर तार में करता है। पाइथन स्ट्रिंग्स में \x नोटेशन का उपयोग कुछ कोडपॉइंट्स बनाने के लिए सिंटैक्स है।

आप स्ट्रिंग बनाने के लिए '\x61' का उपयोग कर सकते हैं, या आप 'a' का उपयोग कर सकते हैं; कहने के केवल दो तरीके हैं, मुझे हेक्साडेसिमल मान 61 के साथ एक वर्ण के साथ एक स्ट्रिंग दें, उदा। a ASCII वर्ण:

>>> '\x61' 
'a' 
>>> 'a' 
'a' 
>>> 'a' == '\x61' 
True 

\xhh वाक्य रचना तो, है नहीं मूल्य; अंतिम परिणाम में \ और x और 10 और 1 वर्ण नहीं है।

आप सिर्फ अपने स्ट्रिंग लिखना चाहिए:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring) 

बाइनरी फ़ाइलों के बारे में जादुई कुछ भी नहीं है; पाठ मोड में खोले गए फ़ाइल के साथ एकमात्र अंतर यह है कि एक बाइनरी फ़ाइल स्वचालित रूप से \n आपके प्लेटफॉर्म के लिए लाइन विभाजक मानक में न्यूलाइन का अनुवाद नहीं करेगी; जैसे विंडोज लेखन \n पर \r\n इसके बजाय उत्पादन करता है।

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

अजगर पर 3 तार यूनिकोड डेटा कर रहे हैं और न सिर्फ एन्कोडिंग के बिना एक फाइल करने के लिए लिखा जा सकता है, लेकिन अजगर पर str प्रकार पहले से ही इनकोडिंग बाइट है। तो पायथन 3 पर आप इसका उपयोग करेंगे:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring.encode('ascii')) 

या आप बाइट स्ट्रिंग अक्षर का उपयोग करेंगे; b'abcd'

+0

अच्छी स्पष्टीकरण मैं हमेशा py3 –

+0

में स्ट्रिंग परिवर्तनों के बारे में भूल जाता हूं, आप आगे भी 'ए' है '\ x61'' –

+1

@ जोरनबेस्ले: ** नहीं, आप ** नहीं कर सकते हैं। CPython दुभाषिया * * अनुकूलित करने का विकल्प चुन सकता है और आप * एक ही स्ट्रिंग ऑब्जेक्ट (और फिर 'काम करता है) के साथ समाप्त हो सकता है, लेकिन यह ** ** ** सलाह नहीं है और आपको कभी इसकी गणना नहीं करनी चाहिए। –

1

मुझे लगता है कि आपको यह समझ में नहीं आता कि बाइनरी/एएससीआई क्या है ... सभी फाइलें इस अर्थ में बाइनरी हैं कि यह सिर्फ बिट्स है। ascii ... फ़ाइल संपादकों के 99.9999%, अगर वे कर सकते हैं ascii के रूप में अपने बिट्स प्रदर्शित करेगा सिर्फ कुछ बिट्स के एक प्रतिनिधित्व है और अगर कोई अन्य एन्कोडिंग फ़ाइल अपने आप में घोषित ... है

fp.write("abcd") 

है बिल्कुल बराबर

fp.write("\x61\x62\x63\x64")