2017-07-13 15 views
6

मैं struct.pack समारोहstruct पैक वापसी बहुत लंबा

import struct 
values = (0, 44) 
s = struct.Struct('HI') 
b = s.pack(*values) 
print(b) 
print(str(len(b))) 

उपयोग करने के लिए कोशिश कर रहा हूँ है और यह मुझे इस उत्पादन देता है:

b'\x00\x00\x00\x00,\x00\x00\x00' 
8 

जबकि python docs कहते हैं:

Format - C Type   - Python type - Standard size - Notes 

H  - unsigned short - integer  - 2    - (3) 

I  - unsigned int - integer  - 4    - (3) 

इसलिए len() 2 + 4 = 6 होना चाहिए, और मुझे आकार = 6

कोई विचार नहीं है?

मैं अजगर 3.6 का उपयोग कर रहा Windows 10

उत्तर

4

pack पैड बाइट्स जोड़ देगा। the documentation से:

डिफ़ॉल्ट रूप से, किसी दिए गए सी struct पैकिंग का परिणाम आदेश शामिल सी प्रकार के लिए उचित संरेखण बनाए रखने के लिए पैड बाइट्स भी शामिल है, करने के लिए ... अंतर्निहित पैड बाइट्स छोड़ देते हैं, मानक आकार और संरेखण के बजाय देशी आकार और संरेखण का उपयोग करें: विवरण

+3

जो मुझे एक जवाब मिला, 'struct.Struct का उपयोग करना चाहिए (' = HI ') ',' struct .स्ट्रक्चर (' HI') ', – Dela

1

पर आकार गणना सीधे निहित देशी प्रकार के लिए additive नहीं है। आप आकार struct.calcsize का उपयोग कर की गणना करना चाहिए: इतना है कि दूसरे पूर्णांक 4 बाइट संरेखित है

In [8]: struct.calcsize('HI') 
Out[8]: 8 
3

"Data structure padding" का एक परिणाम है कि के लिए Byte Order, Size, and Alignment देखते हैं। यह H (2 बाइट्स + 2 बाइट पैडिंग) पैड करेगा ताकि यह I (4 बाइट्स) के साथ संरेखित हो।

हालांकि यदि आप आकार को कम करने की आवश्यकता है तो आप ऑर्डर के साथ प्रयोग कर सकते हैं। संरचना के सदस्यों को पुन: क्रम या संकलक के संरेखण बदल रहा है (या "पैकिंग") के द्वारा (या किसी मौजूदा स्वरूप का पालन करने के लिए)

यह संरचनाओं के संरेखण बदलने के लिए स्मृति वे की आवश्यकता होती है कम करना संभव है: विकिपीडिया के शब्दों में संरचना के सदस्य

अपने कंप्यूटर पर उदाहरण के लिए यह काम करता है अगर आप सिर्फ H और I स्वैप:

import struct 
values = (0, 1) 
s = struct.Struct('IH')   # swapped H and I 
b = s.pack(*values) 
print(b)      # b'\x00\x00\x00\x00\x01\x00' 
print(str(len(b)))    # 6 
print(struct.calcsize('IH')) # 6 
print(struct.calcsize('HI')) # 8 
संबंधित मुद्दे