अजगर में स्ट्रिंग को बाइनरी में बदलें


106

मुझे अजगर में एक स्ट्रिंग के द्विआधारी प्रतिनिधित्व को प्राप्त करने के तरीके की आवश्यकता है। जैसे

st = "hello world"
toBinary(st)

क्या ऐसा करने का कोई साफ तरीका है?


8
क्या आप विशेष रूप से उत्पादन होने की उम्मीद करते हैं?
एनपीई

"बाइनरी" से, क्या आपका मतलब है 0101010 प्रकार या ordप्रत्येक वर्ण की संख्या (जैसे हेक्स)?
cdarke

यह मानते हुए कि आप वास्तव में द्विआधारी (शून्य और वाले) का अर्थ रखते हैं, क्या आप एक के बाद एक प्रत्येक वर्ण (8 बिट प्रति वर्ण) का द्विआधारी प्रतिनिधित्व चाहते हैं? जैसे h, ascii मान 104 बाइनरी में 01101000 होगा
क्रिसपॉसर

: यह सवाल stackoverflow पर कई बार उत्तर दिया गया है stackoverflow.com/questions/11599226/... stackoverflow.com/questions/8553310/...
0xcaff

जवाबों:


124

कुछ इस तरह?

>>> 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'

21
या यदि आप चाहते हैं कि प्रत्येक बाइनरी संख्या 1 बाइट हो: '' .join (प्रारूप (ord) (i), 'b')। zfill (8) i for st)
क्रिसप्रोसर

5
पूर्ण बाइट्स के लिए आप उपयोग भी कर सकते हैं ' '.join('{0:08b}'.format(ord(x), 'b') for x in st), जो zfill(8)समाधान की तुलना में लगभग 35% तेज है (कम से कम मेरी मशीन पर)।
अधिकतम

अधिक-से-एक-बाइट वर्णों को परिवर्तित करने के बारे में क्या है, जैसे β, उदाहरण के लिए, जो मुझे 11001110 10110010आंतरिक रूप से प्रतिनिधित्व करता है ?
सेर्गेई बुशमैनोव

1
मुझे पता है कि यह बहुत पहले पोस्ट किया गया था, लेकिन गैर-एएससीआईआई पात्रों के बारे में क्या?
pkqxdd

48

एक और अधिक पाइथोनिक तरीके के रूप में आप पहले अपने स्ट्रिंग को बाइट सरणी में बदल सकते हैं और उसके बाद 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


5
न केवल यह अधिक पायथोनिक है, बल्कि मल्टी-बाइट गैर-एएससीआईआई स्ट्रिंग्स के लिए यह "अधिक" सही है।
सेर्गेई बुशमैनोव

बस ध्यान दें कि (कम से कम वर्तमान संस्करण के लिए 3.7.4): (1) bytearrayएक एन्कोडिंग (सिर्फ एक स्ट्रिंग नहीं) और (2) वस्तु map(bin, ...)को वापस कर देगा map। पहले बिंदु के लिए, मैं उदाहरण के लिए उपयोग करता हूं bob.enc ('ascii') `के रूप में @ ताओ द्वारा सुझाए गए। दूसरे के लिए, बिंदु, joinविधि का उपयोग कर , जैसा कि @Kasramvd के अन्य उदाहरणों में वांछित परिणाम प्रदर्शित करेगा।
एंटोनी

35

हमें सिर्फ इसे एनकोड करने की जरूरत है।

'string'.encode('ascii')

मुझे (के लिए v3.7.4), यह रिटर्न एक bytesवस्तु (प्रत्येक बाइट के ascii प्रतिनिधित्व के साथ, यदि उपलब्ध हो), और आदेश अपने द्विआधारी प्रतिनिधित्व प्रदर्शित करने के लिए, मैं की जरूरत है bin, जैसे के साथ ' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))(ध्यान दें कि 0bजरूरतों द्विआधारी प्रतिनिधित्व की शुरुआत में हटा दिया जाना चाहिए प्रत्येक वर्ण का)।
एंटोनी

15

आप 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 वर्ण सेट में शामिल नहीं हैं।


2

पायथन संस्करण 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 (बाइनरी) में परिणामी संख्या को आउटपुट करने के लिए एक संकेत के रूप में कार्य करता है।


1

यह मौजूदा जवाबों के लिए एक अद्यतन है जो इस्तेमाल किया है 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>

0
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 एक बाइट सरणी में परिवर्तित करने में काफी अधिक कुशल है क्योंकि यह प्रत्येक चरित्र को मैन्युअल रूप से पूर्णांक में बदलने के बजाय निम्न स्तर फ़ंक्शन कॉल करता है, और फिर उस पूर्णांक को अपने बाइनरी मान में परिवर्तित करता है।


-1
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))

1
क्या आप इस अपठनीय कोड को केवल कुछ स्पष्टीकरण के साथ उत्तर देना चाहेंगे? यह गलत धारणा से लड़ने में मदद करेगा कि StackOverflow एक नि: शुल्क कोड लेखन सेवा है। यदि आप पठनीयता में सुधार करना चाहते हैं, तो यहां दी गई जानकारी का प्रयास करें: stackoverflow.com/editing-help
युन्नोच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.