পাইথনের স্ট্রিংটিকে বাইনারি রূপান্তর করুন


106

পাইথনের স্ট্রিংয়ের বাইনারি উপস্থাপনা পাওয়ার জন্য আমার একটি উপায় প্রয়োজন। যেমন

st = "hello world"
toBinary(st)

এটি করার কিছু ঝরঝরে উপায়ের একটি মডিউল আছে?


8
আপনি বিশেষত আউটপুটটি কী আশা করবেন?
এনপিই

"বাইনারি" দ্বারা, আপনি কি বলতে চান 0101010 টাইপ বা ordপ্রতিটি অক্ষরের ইনাল সংখ্যা (যেমন হেক্স)?
সিডারকে

ধরে নিচ্ছি যে আপনি আসলে বাইনারি (শূন্য এবং একটি) বোঝাতে চান, আপনি কি একের পর এক প্রতিটি চরিত্রের (প্রতি অক্ষরে 8 বিট) বাইনারি উপস্থাপনা চান? যেমন এইচ এর আসকি মান 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 (ঝ), 'St আমি জন্য খ') zfill (8)।)
ChrisProsser

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'

দ্রষ্টব্য যে পাইথন 3 এ আপনাকে 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হিসাবে ব্যবহার করি। এনকোডিং ('ascii') @ @ টাওয়ের পরামর্শ অনুসারে। দ্বিতীয়টির জন্য, পয়েন্টটি, joinপদ্ধতিটি ব্যবহার করে @ কাসরামভিডির অন্যান্য উদাহরণগুলি পছন্দসই ফলাফল প্রদর্শন করবে।
এন্টোইন

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 এ কাজ করার সময়, আপনি যদি ইউটিএফ -8 বাদে অন্য কোনও এনকোডিং ধরে নিচ্ছেন তবে এই বিষয়টি আরও জটিল হয়ে উঠবে। পাইথন 2-এ স্ট্রিংগুলি বাইট সিকোয়েন্সগুলি হয় এবং ASCII এনকোডিংটি ডিফল্টরূপে ধরে নেওয়া হয়। পাইথন 3-এ স্ট্রিংগুলি ইউনিকোড হিসাবে ধরে নেওয়া হয় এবং এখানে একটি পৃথক bytesপ্রকার রয়েছে যা পাইথন 2 স্ট্রিংয়ের মতো কাজ করে। আপনি যদি ইউটিএফ -8 ব্যতীত অন্য কোনও এনকোডিং অনুমান করতে চান তবে আপনাকে এনকোডিং নির্দিষ্ট করতে হবে।

পাইথন 3 এ, আপনি এর মতো কিছু করতে পারেন:

a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))

ইউটিএফ -8 এবং এসকিআই এনকোডিংয়ের মধ্যে পার্থক্যগুলি সহজ আলফানিউমেরিক স্ট্রিংয়ের জন্য সুস্পষ্ট হবে না, তবে আপনি যদি পাঠ্য প্রক্রিয়াজাতকরণ করেন যা আসকি চরিত্রের সেটগুলিতে নয় অক্ষর অন্তর্ভুক্ত করে তবে তা গুরুত্বপূর্ণ হয়ে উঠবে।


2

পাইথন সংস্করণে 6.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
  • কোলনের বাম দিক, অর্ড (আই) হ'ল আসল অবজেক্ট যার মান ফর্ম্যাট হয়ে আউটপুটে inোকানো হবে। অর্ড () ব্যবহার করা আপনাকে একক স্ট্র অক্ষরের জন্য বেস -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

বুদ্ধি অ্যারেতে রূপান্তর করার ক্ষেত্রে মেথড_বি যথেষ্ট কার্যকরী কারণ এটি প্রতিটি চরিত্রকে ম্যানুয়ালি ইন্টিজারে রূপান্তরিত করার পরিবর্তে নিম্ন স্তরের ফাংশন কলগুলি করে এবং তারপরে সেই পূর্ণসংখ্যাটিকে তার বাইনারি মানের রূপান্তরিত করে।


-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.com/editing-help
Yunnosch
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.