पूर्णांकों को उनके बाइट प्रतिनिधित्व में बदलना प्रोग्रामिंग में एक बारंबार कार्य है, खासकर जब बाइनरी डेटा, नेटवर्क संचार या फ़ाइल I/O के साथ काम किया जाता है। पायथन 2 और पायथन 3 अलग-अलग तरीके प्रदान करते हैं, संभावित रूप से पोर्टेबिलिटी समस्याएँ पैदा करते हैं यदि सही ढंग से संभाला नहीं जाता है। यह लेख विभिन्न विधियों का पता लगाता है, संगतता और प्रदर्शन पर जोर देता है।
विषयवस्तु की तालिका
- क्रॉस-संगत पूर्णांक से बाइट्स रूपांतरण
- पायथन 3 विशिष्ट पूर्णांक से बाइट्स रूपांतरण विधियाँ
- प्रदर्शन तुलना
क्रॉस-संगत पूर्णांक से बाइट्स रूपांतरण
पायथन 2.7 और पायथन 3 के बीच संगतता बनाए रखते हुए पूर्णांकों को बाइट्स में बदलने का सबसे विश्वसनीय तरीका struct
मॉड्यूल का उपयोग करना है। यह मॉड्यूल विभिन्न स्वरूपों में डेटा पैक करने और अनपैक करने के लिए फ़ंक्शन प्रदान करता है।
import struct
def int_to_bytes(integer, num_bytes):
"""एक पूर्णांक को बाइट्स में परिवर्तित करता है, पायथन 2.7 और 3 के साथ संगत।
Args:
integer: परिवर्तित करने के लिए पूर्णांक।
num_bytes: बाइट्स की वांछित संख्या।
Returns:
पूर्णांक का प्रतिनिधित्व करने वाली बाइट्स ऑब्जेक्ट। ValueError उठाता है यदि पूर्णांक
निर्दिष्ट बाइट्स की संख्या के लिए बहुत बड़ा है।
"""
try:
return struct.pack(">I", integer)[:num_bytes] # '>I' बड़े-एंडियन अहस्ताक्षरित int के लिए
except struct.error:
raise ValueError(f"{num_bytes} बाइट्स के लिए पूर्णांक बहुत बड़ा है")
# उदाहरण उपयोग
my_int = 12345
bytes_representation = int_to_bytes(my_int, 4) # 32-बिट पूर्णांक के लिए 4 बाइट्स
print(bytes_representation)
my_large_int = 0xFFFFFFFF # अधिकतम 32-बिट अहस्ताक्षरित पूर्णांक
bytes_representation = int_to_bytes(my_large_int, 4)
print(bytes_representation)
# त्रुटि हैंडलिंग का उदाहरण
try:
bytes_representation = int_to_bytes(my_large_int + 1, 4)
except ValueError as e:
print("त्रुटि:", e)
struct.pack(">I", integer)
पूर्णांक को बड़े-एंडियन अहस्ताक्षरित पूर्णांक के रूप में पैक करता है। [:num_bytes]
स्लाइस आपको आउटपुट लंबाई निर्दिष्ट करने देता है, पूर्णांकों को समायोजित करता है जो कम बाइट्स में फिट हो सकते हैं। try-except
ब्लॉक निर्दिष्ट बाइट क्षमता से अधिक पूर्णांकों को संभालता है। आवश्यकतानुसार प्रारूप स्ट्रिंग (जैसे, >i
हस्ताक्षरित int के लिए, >Q
64-बिट अहस्ताक्षरित int के लिए) समायोजित करें।
पायथन 3 विशिष्ट पूर्णांक से बाइट्स रूपांतरण विधियाँ
पायथन 3 अधिक सरल int.to_bytes()
विधि प्रदान करता है। यह कुशल और संक्षिप्त है लेकिन पायथन 2 समर्थन का अभाव है।
my_int = 12345
# बाइट्स में परिवर्तित करें, बाइट क्रम (बड़े-एंडियन) और बाइट्स की संख्या निर्दिष्ट करें
bytes_representation = my_int.to_bytes(4, byteorder='big') # 4 बाइट्स के साथ उदाहरण
print(bytes_representation)
# बाइट्स में परिवर्तित करें, स्वचालित रूप से बाइट्स की संख्या निर्धारित करें
bytes_representation = my_int.to_bytes((my_int.bit_length() + 7) // 8, byteorder='big')
print(bytes_representation)
byteorder
एंडियननेस निर्दिष्ट करता है (‘big’ बड़े-एंडियन के लिए, ‘little’ छोटे-एंडियन के लिए)। दूसरा उदाहरण स्वचालित रूप से न्यूनतम आवश्यक बाइट्स की गणना करता है।
प्रदर्शन तुलना
पायथन 3 में struct
विधि और int.to_bytes()
के बीच प्रदर्शन अंतर आमतौर पर नगण्य है। अत्यधिक प्रदर्शन-संवेदनशील कोड के लिए कई रूपांतरणों के साथ, बेंचमार्किंग int.to_bytes()
के लिए थोड़ा सा लाभ दिखा सकता है। हालाँकि, पायथन 2.7 संगतता struct
विधि की क्रॉस-संस्करण संगतता महत्वपूर्ण है। अधिकांश परिदृश्यों के लिए, int.to_bytes()
की पठनीयता और स्पष्टता पायथन 3 में struct
से किसी भी मामूली प्रदर्शन लाभ से अधिक है। यदि पायथन 2.7 संगतता आवश्यक है, तो struct
दृष्टिकोण ही एकमात्र व्यवहार्य विकल्प है।
संक्षेप में, अधिकतम संगतता के लिए struct
विधि को प्राथमिकता दें। यदि पायथन 2 संगतता की आवश्यकता नहीं है, तो अधिक संक्षिप्त और थोड़े तेज समाधान के लिए पायथन 3 में int.to_bytes()
का उपयोग करें। बड़े पूर्णांकों या अपर्याप्त बाइट बफ़र्स के साथ समस्याओं को रोकने के लिए हमेशा मजबूत त्रुटि हैंडलिंग शामिल करें।