আমি কীভাবে বাইটসের একটি স্ট্রিংটিকে পাইথন-এ ইনট রূপান্তর করতে পারি?
এভাবে বলুন: 'y\xcc\xa6\xbb'
আমি এটি করার একটি চতুর / মূ way় উপায় নিয়ে এসেছি:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
আমি জানি কিছু অন্তর্নির্মিত বা স্ট্যান্ডার্ড লাইব্রেরিতে থাকতে হবে যা এটি আরও সহজভাবে করে ...
এটি হেক্স ডিজিটের স্ট্রিংকে রূপান্তর করা থেকে পৃথক যার জন্য আপনি ইন্ট (xxx, 16) ব্যবহার করতে পারেন তবে পরিবর্তে আমি প্রকৃত বাইট মানগুলির একটি স্ট্রিং রূপান্তর করতে চাই।
হালনাগাদ:
আমি জেমসের উত্তরটি একটু ভালই পছন্দ করি কারণ এর জন্য অন্য মডিউল আমদানির প্রয়োজন হয় না, তবে গ্রেগের পদ্ধতিটি দ্রুত:
>>> from timeit import Timer
>>> Timer('struct.unpack("<L", "y\xcc\xa6\xbb")[0]', 'import struct').timeit()
0.36242198944091797
>>> Timer("int('y\xcc\xa6\xbb'.encode('hex'), 16)").timeit()
1.1432669162750244
আমার হ্যাকি পদ্ধতি:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
আরও আপডেট:
কেউ অন্য মডিউল আমদানি করতে সমস্যা কি মন্তব্য করেছে। ভাল, একটি মডিউল আমদানি করা অগত্যা সস্তা নয়, একবার দেখুন:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
মডিউলটি আমদানির ব্যয় সহ এই পদ্ধতির যে সমস্ত সুবিধা রয়েছে তা প্রায় উপেক্ষা করে। আমি বিশ্বাস করি যে এটি পুরো বেনমার্ক চালানোর জন্য একবারে এটি আমদানির ব্যয়কে অন্তর্ভুক্ত করবে; প্রতিবার পুনরায় লোড করার জন্য যখন জোর করে তখন কী হয় দেখুন:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
বলা বাহুল্য, যদি আপনি প্রতি ইম্পোর্টের তুলনায় এই পদ্ধতির প্রচুর সম্পাদন করছেন তবে এটি কোনও সমস্যার তুলনামূলকভাবে কম হয়ে যায়। এটি সম্ভবত সিপিইউর চেয়ে i / o ব্যয়ও তাই এটি নির্দিষ্ট মেশিনের ক্ষমতা এবং লোডের বৈশিষ্ট্যের উপর নির্ভর করে।
int.from_bytes) কার্যকর করা যায় না struct.unpack। আরও পঠনযোগ্য ইমো হওয়ার পরে।