मुझे अजगर में एक स्ट्रिंग के द्विआधारी प्रतिनिधित्व को प्राप्त करने के तरीके की आवश्यकता है। जैसे
st = "hello world"
toBinary(st)
क्या ऐसा करने का कोई साफ तरीका है?
ord
प्रत्येक वर्ण की संख्या (जैसे हेक्स)?
मुझे अजगर में एक स्ट्रिंग के द्विआधारी प्रतिनिधित्व को प्राप्त करने के तरीके की आवश्यकता है। जैसे
st = "hello world"
toBinary(st)
क्या ऐसा करने का कोई साफ तरीका है?
ord
प्रत्येक वर्ण की संख्या (जैसे हेक्स)?
जवाबों:
कुछ इस तरह?
>>> st = "hello world"
>>> ' '.join(format(ord(x), 'b') for x in st)
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
#using `bytearray`
>>> ' '.join(format(x, 'b') for x in bytearray(st, 'utf-8'))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
' '.join('{0:08b}'.format(ord(x), 'b') for x in st)
, जो zfill(8)
समाधान की तुलना में लगभग 35% तेज है (कम से कम मेरी मशीन पर)।
β
, उदाहरण के लिए, जो मुझे 11001110 10110010
आंतरिक रूप से प्रतिनिधित्व करता है ?
एक और अधिक पाइथोनिक तरीके के रूप में आप पहले अपने स्ट्रिंग को बाइट सरणी में बदल सकते हैं और उसके बाद bin
फ़ंक्शन का उपयोग कर सकते हैं map
:
>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']
या आप इसमें शामिल हो सकते हैं:
>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
ध्यान दें कि python3 में आपको bytearray
फ़ंक्शन के लिए एन्कोडिंग निर्दिष्ट करने की आवश्यकता है :
>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
आप binascii
अजगर 2 में भी मॉड्यूल का उपयोग कर सकते हैं :
>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
hexlify
बाइनरी डेटा के हेक्साडेसिमल प्रतिनिधित्व को वापस लौटाएं फिर आप 16 को इसके आधार के रूप में निर्दिष्ट करके इंट में परिवर्तित कर सकते हैं और फिर इसे बाइनरी में बदल सकते हैं bin
।
3.7.4
): (1) bytearray
एक एन्कोडिंग (सिर्फ एक स्ट्रिंग नहीं) और (2) वस्तु map(bin, ...)
को वापस कर देगा map
। पहले बिंदु के लिए, मैं उदाहरण के लिए उपयोग करता हूं bob
.enc ('ascii') `के रूप में @ ताओ द्वारा सुझाए गए। दूसरे के लिए, बिंदु, join
विधि का उपयोग कर , जैसा कि @Kasramvd के अन्य उदाहरणों में वांछित परिणाम प्रदर्शित करेगा।
हमें सिर्फ इसे एनकोड करने की जरूरत है।
'string'.encode('ascii')
v3.7.4
), यह रिटर्न एक bytes
वस्तु (प्रत्येक बाइट के ascii प्रतिनिधित्व के साथ, यदि उपलब्ध हो), और आदेश अपने द्विआधारी प्रतिनिधित्व प्रदर्शित करने के लिए, मैं की जरूरत है bin
, जैसे के साथ ' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))
(ध्यान दें कि 0b
जरूरतों द्विआधारी प्रतिनिधित्व की शुरुआत में हटा दिया जाना चाहिए प्रत्येक वर्ण का)।
आप ord()
अंतर्निहित फ़ंक्शन का उपयोग करके अपने स्ट्रिंग में वर्णों के लिए कोड मानों तक पहुंच सकते हैं । यदि आपको इसे बाइनरी में प्रारूपित करने की आवश्यकता है, तो string.format()
विधि काम करेगी।
a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(उस कोड स्निपेट को पोस्ट करने के लिए अश्विनी चौधरी का धन्यवाद।)
जबकि उपरोक्त कोड पायथन 3 में काम करता है, यह मामला अधिक जटिल हो जाता है यदि आप UTF-8 के अलावा किसी भी एन्कोडिंग को मान रहे हैं। पायथन 2 में, स्ट्रिंग्स बाइट सीक्वेंस हैं, और एएससीआईआई एन्कोडिंग डिफ़ॉल्ट रूप से ग्रहण की जाती है। पायथन 3 में, स्ट्रिंग्स को यूनिकोड माना जाता है, और एक अलग bytes
प्रकार है जो पायथन 2 स्ट्रिंग की तरह अधिक कार्य करता है। यदि आप UTF-8 के अलावा किसी भी एन्कोडिंग को ग्रहण करना चाहते हैं, तो आपको एन्कोडिंग निर्दिष्ट करने की आवश्यकता होगी।
पायथन 3 में, फिर, आप कुछ इस तरह से कर सकते हैं:
a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))
UTF-8 और ascii एन्कोडिंग के बीच का अंतर सरल अल्फ़ान्यूमेरिक स्ट्रिंग्स के लिए स्पष्ट नहीं होगा, लेकिन महत्वपूर्ण होगा यदि आप टेक्स्ट को संसाधित कर रहे हैं जिसमें वर्ण ascii वर्ण सेट में शामिल नहीं हैं।
पायथन संस्करण 3.6 और इसके बाद के संस्करण में आप एफ-स्ट्रिंग को प्रारूपित करने के लिए उपयोग कर सकते हैं ।
str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
बृहदान्त्र के बाईं ओर, ord (i), वास्तविक वस्तु है जिसका मूल्य स्वरूपित किया जाएगा और आउटपुट में डाला जाएगा। Ord () का उपयोग करने से आपको सिंगल स्ट्रेट कैरेक्टर के लिए बेस -10 कोड पॉइंट मिलता है।
बृहदान्त्र के दाहिने हाथ की ओर प्रारूप निर्दिष्ट है। 08 का अर्थ है चौड़ाई 8, 0 गद्देदार, और बी आधार 2 (बाइनरी) में परिणामी संख्या को आउटपुट करने के लिए एक संकेत के रूप में कार्य करता है।
यह मौजूदा जवाबों के लिए एक अद्यतन है जो इस्तेमाल किया है bytearray()
और अब उस तरह से काम नहीं कर सकता है:
>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
क्योंकि, जैसा कि ऊपर दिए गए लिंक में बताया गया है, यदि स्रोत एक स्ट्रिंग है, तो आपको एन्कोडिंग भी देनी होगी :
>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
def method_a(sample_string):
binary = ' '.join(format(ord(x), 'b') for x in sample_string)
def method_b(sample_string):
binary = ' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))
if __name__ == '__main__':
from timeit import timeit
sample_string = 'Convert this ascii strong to binary.'
print(
timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b')
)
# 9.564299999998184 2.943955828988692
Method_b एक बाइट सरणी में परिवर्तित करने में काफी अधिक कुशल है क्योंकि यह प्रत्येक चरित्र को मैन्युअल रूप से पूर्णांक में बदलने के बजाय निम्न स्तर फ़ंक्शन कॉल करता है, और फिर उस पूर्णांक को अपने बाइनरी मान में परिवर्तित करता है।
a = list(input("Enter a string\t: "))
def fun(a):
c =' '.join(['0'*(8-len(bin(ord(i))[2:]))+(bin(ord(i))[2:]) for i in a])
return c
print(fun(a))