পাইথনের স্ট্রিংয়ের বাইনারি উপস্থাপনা পাওয়ার জন্য আমার একটি উপায় প্রয়োজন। যেমন
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'
দ্রষ্টব্য যে পাইথন 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
।
3.7.4
): (1) bytearray
একটি এনকোডিং (কেবল একটি স্ট্রিং নয় ) প্রত্যাশা করে এবং (2) অবজেক্টটি map(bin, ...)
ফিরিয়ে দেবে map
। প্রথম পয়েন্টের জন্য, আমি উদাহরণ bob
হিসাবে ব্যবহার করি। এনকোডিং ('ascii') @ @ টাওয়ের পরামর্শ অনুসারে। দ্বিতীয়টির জন্য, পয়েন্টটি, join
পদ্ধতিটি ব্যবহার করে @ কাসরামভিডির অন্যান্য উদাহরণগুলি পছন্দসই ফলাফল প্রদর্শন করবে।
আমাদের কেবল এটি এনকোড করা দরকার।
'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 এ কাজ করার সময়, আপনি যদি ইউটিএফ -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 এবং এসকিআই এনকোডিংয়ের মধ্যে পার্থক্যগুলি সহজ আলফানিউমেরিক স্ট্রিংয়ের জন্য সুস্পষ্ট হবে না, তবে আপনি যদি পাঠ্য প্রক্রিয়াজাতকরণ করেন যা আসকি চরিত্রের সেটগুলিতে নয় অক্ষর অন্তর্ভুক্ত করে তবে তা গুরুত্বপূর্ণ হয়ে উঠবে।
পাইথন সংস্করণে 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 এর ফলে সংখ্যাটি আউটপুট করার জন্য একটি চিহ্ন হিসাবে বি ফাংশন (বাইনারি)।
এটি বিদ্যমান উত্তরের জন্য একটি আপডেট যা ব্যবহার করে 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
বুদ্ধি অ্যারেতে রূপান্তর করার ক্ষেত্রে মেথড_বি যথেষ্ট কার্যকরী কারণ এটি প্রতিটি চরিত্রকে ম্যানুয়ালি ইন্টিজারে রূপান্তরিত করার পরিবর্তে নিম্ন স্তরের ফাংশন কলগুলি করে এবং তারপরে সেই পূর্ণসংখ্যাটিকে তার বাইনারি মানের রূপান্তরিত করে।
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))