পাইথন 3-এ ইনটকে বাইটে রূপান্তর করা


177

আমি পাইথন 3 এ এই বাইটগুলি তৈরির চেষ্টা করছিলাম:

b'3\r\n'

সুতরাং আমি স্পষ্ট চেষ্টা করেছি (আমার জন্য), এবং একটি অদ্ভুত আচরণ পেয়েছি:

>>> bytes(3) + b'\r\n'
b'\x00\x00\x00\r\n'

দৃশ্যত:

>>> bytes(10)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

ডকুমেন্টেশন পড়তে বাইট রূপান্তর কেন এভাবে কাজ করে সে সম্পর্কে আমি কোনও পয়েন্টার দেখতে অক্ষম হয়েছি। তবে, পাইথন ইস্যুতে আমি formatবাইটস যুক্ত করার বিষয়ে কিছু চমকপ্রদ বার্তা পেয়েছি ( পাইথন 3 বাইট ফর্ম্যাটিংটিও দেখুন ):

http://bugs.python.org/issue3982

এটি এখন আরও জিরো ফেরানোর মতো বাইটস (ইনট) এর মত বিজোড়াদের সাথে আরও খারাপভাবে ইন্টারঅ্যাক্ট করে

এবং:

আমার পক্ষে এটি আরও সুবিধাজনক হবে যদি বাইটস (ইনট্রে) সেই ইনটারের এএসসিআইফিকেশন ফিরিয়ে দেয়; তবে সত্যি বলতে, এমনকি একটি ত্রুটিও এই আচরণের চেয়ে ভাল। (যদি আমি এই আচরণটি চাইতাম - যা আমার কখনও ছিল না - আমি বরং এটি "বাইটস.জেরোজ (এন)" এর মতো অনুরোধ করা একটি শ্রেণিবদ্ধ হয়েছি))

এই আচরণটি কোথা থেকে এসেছে কেউ আমাকে ব্যাখ্যা করতে পারেন?


1
শিরোনাম সম্পর্কিত:3 .to_bytes
jfs

2
আপনার প্রশ্ন থেকে এটি স্পষ্ট নয় যদি আপনি পূর্ণসংখ্যার মান 3 চান বা তিন নম্বর (পূর্ণসংখ্যা মান 51) উপস্থাপনকারী ASCII চরিত্রের মান চান তবে। প্রথমটি হচ্ছে বাইটস ([3]) == বি '\ x03'। পরবর্তীটি বাইটস ([অর্ডার ('3')]) == বি'3 '।
ফ্লোরিসা

উত্তর:


177

এটি bytesসেইভাবে ডিজাইন করা হয়েছিল - এবং এটি বোধগম্য হয় কারণ সাধারণত, আপনি একটি একক পূর্ণসংখ্যার পরিবর্তে পুনরাবৃত্তি করতে পারেন:

>>> bytes([3])
b'\x03'

ডক্স এই রাষ্ট্র , সেইসাথে জন্য docstring bytes:

 >>> help(bytes)
 ...
 bytes(int) -> bytes object of size given by the parameter initialized with null bytes

25
সাবধান হন যে উপরেরটি কেবল অজগর 3 নিয়ে কাজ করে p পাইথন 2 bytesএ কেবলমাত্র একটি উপাম str, যার অর্থ bytes([3])আপনাকে দেয় '[3]'
botchniaque

8
পাইথন 3-তে, নোট করুন যে bytes([n])কেবল 0 থেকে 255 পর্যন্ত ইন্ট এন এর জন্য কাজ করে anything অন্য যে কোনও কিছুর জন্য এটি উত্থাপন করে ValueError
একিউম্যানাস

8
@ এ বি বি: সত্যিই অবাক হওয়ার কিছু নেই যেহেতু কোনও বাইট কেবল 0 থেকে 255 এর মধ্যে মান সংরক্ষণ করতে পারে
টিম পিটজেকার

7
এটিও লক্ষ করা উচিত যে bytes([3])ওপি যা চেয়েছিল তার থেকে এখনও আলাদা - যথা ASCII তে "3" অঙ্কটি এনকোড করতে ব্যবহৃত বাইট মানটি, অর্থাৎ। bytes([51]), যা হয় b'3'না b'\x03'
লেন্স 21

2
bytes(500)একটি বাইট্রেস্টিং ডাব্লু / লেন == 500 তৈরি করে It এটি পূর্ণমানের 500 কে এনকোড করে এমন একটি বায়স্টেরিং তৈরি করে না And এবং আমি সম্মত হয়েছি যে bytes([500])কাজ করতে পারে না, এ কারণেই এটিও ভুল উত্তর। সম্ভবত সঠিক উত্তরটি int.to_bytes()সংস্করণ> = 3.1 এর জন্য।
weberc2

198

পাইথন ৩.২ থেকে আপনি করতে পারেন

>>> (1024).to_bytes(2, byteorder='big')
b'\x04\x00'

https://docs.python.org/3/library/stdtypes.html#int.to_bytes

def int_to_bytes(x: int) -> bytes:
    return x.to_bytes((x.bit_length() + 7) // 8, 'big')

def int_from_bytes(xbytes: bytes) -> int:
    return int.from_bytes(xbytes, 'big')

তদনুসারে x == int_from_bytes(int_to_bytes(x)),। নোট করুন যে এই এনকোডিংটি কেবল স্বাক্ষরযুক্ত (অ-নেতিবাচক) পূর্ণসংখ্যার জন্য কাজ করে।


4
যদিও এই উত্তরটি ভাল, এটি কেবল স্বাক্ষরযুক্ত (অ-নেতিবাচক) পূর্ণসংখ্যার জন্য কাজ করে। আমি এটি একটি উত্তর লিখতে রূপান্তর করেছি যা স্বাক্ষরিত পূর্ণসংখ্যার জন্যও কাজ করে।
একিউম্যানাস

1
যে পেয়ে সঙ্গে সাহায্য না b"3"থেকে 3, যেমন প্রশ্ন অনুরোধ। (এটি দেবে b"\x03"))
gsnedders

40

আপনি কাঠামোর প্যাকটি ব্যবহার করতে পারেন :

In [11]: struct.pack(">I", 1)
Out[11]: '\x00\x00\x00\x01'

">" হয় বাইট-অর্ডার (বড়-endian) এবং "আমি" হয় বিন্যাস চরিত্র । সুতরাং আপনি অন্য কিছু করতে চাইলে আপনি সুনির্দিষ্ট হতে পারেন:

In [12]: struct.pack("<H", 1)
Out[12]: '\x01\x00'

In [13]: struct.pack("B", 1)
Out[13]: '\x01'

এটি পাইথন 2 এবং পাইথন 3 উভয় ক্ষেত্রে একই কাজ করে ।

দ্রষ্টব্য: বিপরীতমুখী অপারেশন (বাইট টু ইনট) আনপ্যাক দিয়ে করা যায়


2
নির্মল করতে, যেহেতু একটি struct ইনপুট নির্বিশেষে একটি প্রমিত আকার @AndyHayden, I, H, এবং Bপর্যন্ত কাজ 2**k - 1যেখানে ট 32, 16, এবং 8 যথাক্রমে হয়। বড় ইনপুট জন্য তারা উত্থাপন struct.error
একিউম্যানাস

সম্ভবত প্রশ্নের জবাব না দেয়ায় নিচে ভোট দেওয়া হয়েছে: ওপি কীভাবে উত্পন্ন করতে পারে তা জানতে চায় b'3\r\n', অর্থাৎ ASCII অক্ষর "3" সমন্বিত একটি বাইট স্ট্রিং "\ x03" নয়
ডেভ জোনস

1
@ ডেভ জোনস আপনাকে কী ভাবেন যে ওপি তা চায়? গৃহীত উত্তর আয় \x03, এবং সমাধান যদি আপনি শুধু চাই b'3'তুচ্ছ হয়। এবিবি কর্তৃক উল্লেখযোগ্য কারণটি অনেক বেশি প্রশংসনীয় ... বা কমপক্ষে বোধগম্য।
অ্যান্ডি হেডেন

@ ডেভজোনস এছাড়াও, আমি এই উত্তরটি যুক্ত করার কারণ হ'ল এটি করার জন্য গুগল আপনাকে এখানে নিয়ে যায় prec সুতরাং এখানে কেন।
অ্যান্ডি হেডেন

4
এটি কেবল 2 এবং 3 তে একই কাজ করে না, তবে পাইথন 3.5 তে এটি bytes([x])এবং (x).to_bytes()পদ্ধতি উভয়ের চেয়েও দ্রুত । সেটা ছিল অপ্রত্যাশিত।
মার্ক রান্সম

25

পাইথন 3.5+ printfবাইটের জন্য %-ইন্টারপ্লোলেশন ( স্টাইল ফর্ম্যাটিং) উপস্থাপন করেছে :

>>> b'%d\r\n' % 3
b'3\r\n'

পিইপি 0461 দেখুন - বাইটস এবং বাইটারিতে% ফর্ম্যাটিং যুক্ত করা

পূর্ববর্তী সংস্করণগুলিতে, আপনি ব্যবহার করতে পারেন strএবং .encode('ascii')ফলাফল:

>>> s = '%d\r\n' % 3
>>> s.encode('ascii')
b'3\r\n'

দ্রষ্টব্য: যা int.to_bytesউত্পাদন করে তার থেকে আলাদা :

>>> n = 3
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big') or b'\0'
b'\x03'
>>> b'3' == b'\x33' != '\x03'
True

11

নথি বলছে:

bytes(int) -> bytes object of size given by the parameter
              initialized with null bytes

ক্রম:

b'3\r\n'

এটি '3' (দশমিক 51) অক্ষর '\ r' (13) এবং '\ n' (10)।

অতএব, উপায় এটির মতো ব্যবহার করবে উদাহরণস্বরূপ:

>>> bytes([51, 13, 10])
b'3\r\n'

>>> bytes('3', 'utf8') + b'\r\n'
b'3\r\n'

>>> n = 3
>>> bytes(str(n), 'ascii') + b'\r\n'
b'3\r\n'

আইপথন 1.1.0 এবং পাইথন 3.2.3 এ পরীক্ষিত on


1
আমি শেষ bytes(str(n), 'ascii') + b'\r\n'বা শেষ str(n).encode('ascii') + b'\r\n'। ধন্যবাদ! :)
অ্যাস্ট্রোজুয়ানলু 9'14

1
@ জুয়ানলু ২০০১, এছাড়াও "{}\r\n".format(n).encode()আমি মনে করি না যে ডিফল্ট ইউটিএফ ৮ এনকোডিং ব্যবহার করে কোনও ক্ষতি হয়েছে
জন লা রুই

6

৩ এর এএসসিআইফিকেশন "\x33"নয় "\x03"!

পাইথন এটিই করে str(3)তবে এটি বাইটগুলির পক্ষে সম্পূর্ণ ভুল হবে কারণ এগুলি বাইনারি ডেটার অ্যারে হিসাবে বিবেচনা করা উচিত এবং স্ট্রিং হিসাবে অপব্যবহার করা উচিত নয়।

আপনি bytes((3,))যা চান তা অর্জনের সবচেয়ে সহজ উপায় যা bytes([3])তালিকার সূচনা করা আরও ব্যয়বহুল, এর চেয়ে ভাল কারণ আপনি যখন টিউপস ব্যবহার করতে পারেন তখন কখনই তালিকাগুলি ব্যবহার করবেন না। আপনি বড় বড় পূর্ণসংখ্যার ব্যবহার করে রূপান্তর করতে পারেন int.to_bytes(3, "little")

একটি নির্দিষ্ট দৈর্ঘ্যের সাথে বাইটগুলি শুরু করা অর্থবহ করে এবং সবচেয়ে দরকারী, কারণ এগুলি প্রায়শই কিছু ধরণের বাফার তৈরি করতে ব্যবহৃত হয় যার জন্য আপনার প্রদত্ত আকারের কিছু মেমরির প্রয়োজন। আমি প্রায়শই এটি ব্যবহার শুরু করি যখন অ্যারেগুলি শুরু করার সময় বা এতে কোনও জিরো লিখে কোনও ফাইল প্রসারিত করি।


1
(ক) এর পালাবার স্বরলিপি: এই উত্তর সঙ্গে বেশ কিছু সমস্যা আছে b'3'অর্থাৎ b'\x33', না b'\x32'। (খ) (3)টিপল নয় - আপনাকে কমা যোগ করতে হবে। (গ) শূন্যগুলির সাথে ক্রম শুরু করার দৃশ্য bytesবস্তুগুলির ক্ষেত্রে প্রযোজ্য নয় , কারণ তারা অপরিবর্তনীয় ( bytearrayযদিও এটি এর জন্য অর্থবোধ করে )।
লেনজ

আপনার মন্তব্যের জন্য ধন্যবাদ. আমি এই দুটি সুস্পষ্ট ভুল সংশোধন করেছি। ক্ষেত্রে bytesএবং bytearray, আমি মনে করি এটা বেশিরভাগ দৃঢ়তা একটি ব্যাপার আছে। তবে আপনি যদি কিছু শূন্যকে কোনও বাফার বা ফাইলের মধ্যে চাপ দিতে চান তবে এটি কার্যকরও হয়, সেক্ষেত্রে এটি কেবলমাত্র ডেটা উত্স হিসাবে ব্যবহৃত হয়।
বাচসউ

5

int(পাইথন 2 এর সহ long) bytesনিম্নলিখিত ফাংশনটি ব্যবহার করে রূপান্তর করা যেতে পারে :

import codecs

def int2bytes(i):
    hex_value = '{0:x}'.format(i)
    # make length of hex_value a multiple of two
    hex_value = '0' * (len(hex_value) % 2) + hex_value
    return codecs.decode(hex_value, 'hex_codec')

বিপরীত রূপান্তর অন্য একটি দ্বারা করা যেতে পারে:

import codecs
import six  # should be installed via 'pip install six'

long = six.integer_types[-1]

def bytes2int(b):
    return long(codecs.encode(b, 'hex_codec'), 16)

উভয় ফাংশন পাইথন 2 এবং পাইথন 3 উভয় ক্ষেত্রেই কাজ করে।


'hex_value ='% x '% i' পাইথন ৩.৪ এর অধীনে কাজ করবে না। আপনি একটি টাইপরর পেয়েছেন, সুতরাং পরিবর্তে আপনাকে হেক্স () ব্যবহার করতে হবে।
বিজেএমসি

@bjmc str.format এর সাথে প্রতিস্থাপন করা হয়েছে। এটি পাইথন 2.6+ এ কাজ করা উচিত।
renskiy

ধন্যবাদ, @ রেনস্কি কারণ এটি মত মনে হয় আপনি পরিবর্তে 'হেক্স' এর 'hex_codec' ব্যবহার করতে চাইতে পারেন 'হেক্স' ওরফে উপলব্ধ নয় সব পাইথন 3 রিলিজ দেখতে stackoverflow.com/a/12917604/845210
বিজেএমসির

@ বিজেএমসি স্থির ধন্যবাদ
রেনস্কি

এটি অজগর 3.6 এ নেতিবাচক পূর্ণসংখ্যায় ব্যর্থ হয়
বার্সার

4

আমি পরিসীমাটিতে একক অভ্যন্তরের জন্য বিভিন্ন পদ্ধতির পারফরম্যান্স সম্পর্কে আগ্রহী ছিলাম [0, 255], তাই আমি কিছু সময় পরীক্ষা করার সিদ্ধান্ত নিয়েছিলাম।

নিচে সময় উপর ভিত্তি করে, এবং সাধারণ প্রবণতা আমি বিভিন্ন মূল্যবোধ ও কনফিগারেশনের চেষ্টা থেকে পরিলক্ষিত থেকে struct.packদ্রুততম, দ্বারা অনুসরণ হবে বলে মনে হয় int.to_bytes, bytes, এবং str.encode(unsurprisingly) ধীরতম হচ্ছে। নোট করুন যে ফলাফলগুলি প্রতিনিধিত্ব করা হওয়ার চেয়ে আরও কিছু বৈচিত্র দেখায় এবং int.to_bytesএবংbytes কখনও কখনও পরীক্ষার সময় গতি র‌্যাঙ্কিং স্যুইচ করে তবে struct.packস্পষ্টতই এটি দ্রুততম।

উইন্ডোজে সিপিথন ৩.7-এ ফলাফল:

Testing with 63:
bytes_: 100000 loops, best of 5: 3.3 usec per loop
to_bytes: 100000 loops, best of 5: 2.72 usec per loop
struct_pack: 100000 loops, best of 5: 2.32 usec per loop
chr_encode: 50000 loops, best of 5: 3.66 usec per loop

পরীক্ষার মডিউল (নামযুক্ত int_to_byte.py):

"""Functions for converting a single int to a bytes object with that int's value."""

import random
import shlex
import struct
import timeit

def bytes_(i):
    """From Tim Pietzcker's answer:
    https://stackoverflow.com/a/21017834/8117067
    """
    return bytes([i])

def to_bytes(i):
    """From brunsgaard's answer:
    https://stackoverflow.com/a/30375198/8117067
    """
    return i.to_bytes(1, byteorder='big')

def struct_pack(i):
    """From Andy Hayden's answer:
    https://stackoverflow.com/a/26920966/8117067
    """
    return struct.pack('B', i)

# Originally, jfs's answer was considered for testing,
# but the result is not identical to the other methods
# https://stackoverflow.com/a/31761722/8117067

def chr_encode(i):
    """Another method, from Quuxplusone's answer here:
    https://codereview.stackexchange.com/a/210789/140921

    Similar to g10guang's answer:
    https://stackoverflow.com/a/51558790/8117067
    """
    return chr(i).encode('latin1')

converters = [bytes_, to_bytes, struct_pack, chr_encode]

def one_byte_equality_test():
    """Test that results are identical for ints in the range [0, 255]."""
    for i in range(256):
        results = [c(i) for c in converters]
        # Test that all results are equal
        start = results[0]
        if any(start != b for b in results):
            raise ValueError(results)

def timing_tests(value=None):
    """Test each of the functions with a random int."""
    if value is None:
        # random.randint takes more time than int to byte conversion
        # so it can't be a part of the timeit call
        value = random.randint(0, 255)
    print(f'Testing with {value}:')
    for c in converters:
        print(f'{c.__name__}: ', end='')
        # Uses technique borrowed from https://stackoverflow.com/q/19062202/8117067
        timeit.main(args=shlex.split(
            f"-s 'from int_to_byte import {c.__name__}; value = {value}' " +
            f"'{c.__name__}(value)'"
        ))

1
@ এ বি বি আমার প্রথম বাক্যে যেমন উল্লেখ করা হয়েছে, আমি কেবলমাত্র এটি পরিসরের একটি একক প্রকারের জন্য পরিমাপ করছি [0, 255]। আমি "ভুল সূচক" দ্বারা ধরে নিয়েছি আপনি বলতে চাইছেন আমার পরিমাপ বেশিরভাগ পরিস্থিতিতে ফিট করার পক্ষে যথেষ্ট সাধারণ ছিল না? নাকি আমার পরিমাপের পদ্ধতিটি ছিল দুর্বল? যদি দ্বিতীয়টি হয় তবে আপনার বক্তব্য আমি শুনতে আগ্রহী, তবে যদি পূর্ববর্তী হয় তবে আমি কখনও দাবি করি না যে আমার পরিমাপ সমস্ত ব্যবহারের ক্ষেত্রে সাধারণ ছিল। আমার (সম্ভবত কুলুঙ্গি) পরিস্থিতিটির জন্য, আমি কেবলমাত্র পরিসরের ইনটগুলি নিয়েই কাজ করছি [0, 255], এবং এই শ্রোতাদেরই আমি এই উত্তরটির সাথে সম্বোধন করতে চেয়েছিলাম। আমার উত্তরটি কি অস্পষ্ট ছিল? আমি স্বচ্ছতার জন্য এটি সম্পাদনা করতে পারি ...
গ্রাহাম

1
কেবলমাত্র পরিসীমাটির জন্য প্রাক্পম্পিউটেড এনকোডিংয়ের সূচি দেওয়ার কৌশলটি কী? পূর্ববর্তীকরণ সময় সাপেক্ষে হবে না, কেবল সূচীকরণ হবে।
একিউমেনাস

@ এ বি বি এটি একটি ভাল ধারণা। মনে হচ্ছে এটি অন্য যে কোনও কিছুর চেয়ে দ্রুত হবে। আমি কিছু সময় নিই এবং এই উত্তরটিতে যুক্ত করব যখন আমার কিছুটা সময় থাকবে।
গ্রাহাম

3
আপনি যদি সত্যই বাইটস-থেকে-পুনরাবৃত্তিযোগ্য জিনিসটি টাইম করতে চান তবে তালিকাটি আরও জটিল হওয়ার bytes((i,))পরিবর্তে আপনার ব্যবহার করা উচিত bytes([i]), আরও মেমরি ব্যবহার করুন এবং আরম্ভ করতে দীর্ঘ সময় নিতে হবে। এই ক্ষেত্রে, কিছুই জন্য।
বাচসউ

4

ব্রুনসগার্ডের পূর্বের উত্তরটি একটি কার্যকর এনকোডিং হলেও এটি কেবল স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য কাজ করে। স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন উভয় পূর্ণসংখ্যার জন্য কাজ করার জন্য এটি এটি তৈরি করে।

def int_to_bytes(i: int, *, signed: bool = False) -> bytes:
    length = ((i + ((i * signed) < 0)).bit_length() + 7 + signed) // 8
    return i.to_bytes(length, byteorder='big', signed=signed)

def bytes_to_int(b: bytes, *, signed: bool = False) -> int:
    return int.from_bytes(b, byteorder='big', signed=signed)

# Test unsigned:
for i in range(1025):
    assert i == bytes_to_int(int_to_bytes(i))

# Test signed:
for i in range(-1024, 1025):
    assert i == bytes_to_int(int_to_bytes(i, signed=True), signed=True)

এনকোডারটির (i + ((i * signed) < 0)).bit_length()পরিবর্তে কেবল ব্যবহৃত হয় i.bit_length()কারণ পরেরটি -128, -32768, ইত্যাদির অকার্যকর এনকোডিংয়ের দিকে নিয়ে যায় because


ক্রেডিট: একটি সামান্য অক্ষমতা ঠিক করার জন্য সার্ভড E


int_to_bytes(-128, signed=True) == (-128).to_bytes(1, byteorder="big", signed=True)হলFalse
সার্ভেড

আপনি দৈর্ঘ্য 2 ব্যবহার করছেন না, আপনি স্বাক্ষরিত পূর্ণসংখ্যার বিট দৈর্ঘ্য গণনা করছেন, 7 যোগ করছেন এবং তারপরে 1, যদি এটি কোনও স্বাক্ষরিত পূর্ণসংখ্যা হয়। অবশেষে আপনি এটিকে দৈর্ঘ্যে বাইটে রূপান্তর করুন। এই জন্য অপ্রত্যাশিত ফলাফল উৎপাদ -128, -32768ইত্যাদি
CervEd


এইভাবে আপনি এটি ঠিক করুন(i+(signed*i<0)).bit_length()
সার্ভেড

3

আচরণটি বাস্তবতা থেকে আসে যে পাইথনের সংস্করণ 3 এর পূর্বে bytesকেবলমাত্র একটি নাম ছিল str। পাইথন 3.x bytesহ'ল একটি bytearrayসম্পূর্ণ অপরিবর্তনীয় সংস্করণ - সম্পূর্ণ নতুন ধরণের, পিছনের দিকে সামঞ্জস্যপূর্ণ নয়।


3

বাইট ডক্স থেকে :

তদনুসারে, কনস্ট্রাক্টর আর্গুমেন্টগুলি বাইটায়ারে () হিসাবে ব্যাখ্যা করা হয়।

তারপরে, বাইটারারি ডক্স থেকে :

Differentচ্ছিক উত্স প্যারামিটারটি কয়েকটি বিভিন্ন উপায়ে অ্যারে শুরু করতে ব্যবহার করা যেতে পারে:

  • যদি এটি একটি পূর্ণসংখ্যা হয় তবে অ্যারেটির আকারটি হবে এবং নাল বাইটের সাহায্যে আরম্ভ করা হবে।

দ্রষ্টব্য, এটি 2.x (যেখানে x> = 6) আচরণের থেকে পৃথক, যেখানে bytesকেবল এটি str:

>>> bytes is str
True

পিইপি 3112 :

2.6 স্ট্রাইট বিভিন্ন উপায়ে 3.0 এর বাইট টাইপ থেকে পৃথক; সবচেয়ে উল্লেখযোগ্যভাবে, কনস্ট্রাক্টর সম্পূর্ণ আলাদা।


0

কিছু উত্তর বড় সংখ্যক দিয়ে কাজ করে না।

পূর্ণসংখ্যাকে হেক্স উপস্থাপনায় রূপান্তর করুন, তারপরে এটিকে বাইটে রূপান্তর করুন:

def int_to_bytes(number):
    hrepr = hex(number).replace('0x', '')
    if len(hrepr) % 2 == 1:
        hrepr = '0' + hrepr
    return bytes.fromhex(hrepr)

ফলাফল:

>>> int_to_bytes(2**256 - 1)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'

1
"অন্যান্য সমস্ত পদ্ধতি বড় সংখ্যক দিয়ে কাজ করে না" " এটি সত্য নয়, int.to_bytesকোনও পূর্ণসংখ্যার সাথে কাজ করে।
juanpa.arrivillaga

@ জুয়ানপা.আরিভিলাগা হ্যাঁ, আমার খারাপ। আমি আমার উত্তর সম্পাদনা করেছি।
ম্যাক্স ম্যালিশ

-1

যদি প্রশ্নটি হয় তবে কীভাবে কোনও পূর্ণসংখ্যা নিজেই (তার স্ট্রিং সমতুল্য নয়) বাইটে রূপান্তর করা যায় তবে আমি মনে করি দৃ answer় উত্তরটি:

>>> i = 5
>>> i.to_bytes(2, 'big')
b'\x00\x05'
>>> int.from_bytes(i.to_bytes(2, 'big'), byteorder='big')
5

এই পদ্ধতিগুলি সম্পর্কে এখানে আরও তথ্য:

  1. https://docs.python.org/3.8/library/stdtypes.html#int.to_bytes
  2. https://docs.python.org/3.8/library/stdtypes.html#int.from_bytes

1
এটি 5 বছর আগে পোস্ট করা এবং বর্তমানে সর্বাধিক ভোট দেওয়া উত্তর, কীভাবে ব্রুনসগার্ডের উত্তর থেকে আলাদা?
আর্থার টাক্কা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.