मैं पाइथन में बाइट्स की सरणी के रूप में एक पूर्णांक का इलाज कैसे करूं?

मैं पाइथन os.wait() फ़ंक्शन के परिणाम को डीकोड करने का प्रयास कर रहा हूं। पायथन डॉक्स के अनुसार, यह रिटर्न:

एक ट्यूपल जिसमें उसकी पिड और निकास स्थिति संकेत शामिल है: एक 16-बिट संख्या, जिसका निम्न बाइट सिग्नल नंबर है जो प्रक्रिया को मारता है, और जिसका उच्च बाइट बाहर निकलने की स्थिति है (यदि सिग्नल नंबर शून्य है); कोर फ़ाइल का उत्पादन होने पर निम्न बाइट का उच्च सेट सेट होता है।

उच्च और निम्न बाइट प्राप्त करने के लिए मैं निकास स्थिति संकेत (जो एक पूर्णांक है) को डीकोड कैसे करूं? विशिष्ट होने के लिए, मैं निम्न कोड स्निपेट में उपयोग किए गए डीकोड फ़ंक्शन को कैसे कार्यान्वित करूं:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
0
ro fr bn

7 उत्तर

यह वही करेगा जो आप चाहते हैं:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
0
जोड़ा
अनावश्यक, लेकिन मैंने सोचा कि यह थोड़ा और स्पष्ट था।
जोड़ा लेखक Mark Harrison, स्रोत
हालांकि & 0xff00 अनावश्यक है यदि स्थिति वास्तव में केवल 16 बिट्स है।
जोड़ा लेखक Scott Griffiths, स्रोत

मेरे सामने लोगों ने इसे खींचा है, लेकिन यदि आप वास्तव में इसे एक पंक्ति पर चाहते हैं, तो आप यह कर सकते हैं:

(signum, exitstatus) = (status & 0xFF, (status >> 8) & 0xFF)

संपादित करें: इसे पीछे की ओर था।

0
जोड़ा

आप बिट-स्थानांतरण और मास्किंग ऑपरेटरों।

low = status & 0x00FF
high = (status & 0xFF00) >> 8

मैं एक पायथन प्रोग्रामर नहीं हूं, इसलिए मुझे उम्मीद है कि वाक्यविन्यास सही हो गया है।

0
जोड़ा

आप struct मॉड्यूल के साथ बिना हस्ताक्षरित बाइट्स की एक स्ट्रिंग में अपना int तोड़ सकते हैं:

import struct
i = 3235830701  # 0xC0DEDBAD
s = struct.pack(">L", i)  # ">" = Big-endian, "<" = Little-endian
print s         # '\xc0\xde\xdb\xad'
print s[0]      # '\xc0'
print ord(s[0]) # 192 (which is 0xC0)

यदि आप इसे array मॉड्यूल के साथ जोड़ते हैं तो आप इसे अधिक आसानी से कर सकते हैं:

import struct
i = 3235830701  # 0xC0DEDBAD
s = struct.pack(">L", i)  # ">" = Big-endian, "<" = Little-endian

import array
a = array.array("B")  # B: Unsigned bytes
a.fromstring(s)
print a   # array('B', [192, 222, 219, 173])
0
जोड़ा
exitstatus, signum= divmod(status, 256)
0
जोड़ा

अपने सामान्य प्रश्न का उत्तर देने के लिए, आप बिट मैनिपुलेशन तकनीकों का उपयोग कर सकते हैं:

pid, status = os.wait()
exitstatus, signum = status & 0xFF, (status & 0xFF00) >> 8

हालांकि, बाहर निकलने की व्याख्या करने के लिए अंतर्निहित फ़ंक्शंस भी हैं स्थिति मूल्य:

pid, status = os.wait()
exitstatus, signum = os.WEXITSTATUS( status ), os.WTERMSIG( status )

यह भी देखें:

  • os.WCOREDUMP()
  • os.WIFCONTINUED()
  • os.WIFSTOPPED()
  • os.WIFSIGNALED()
  • os.WIFEXITED()
  • os.WSTOPSIG()
0
जोड़ा
import amp as amp
import status
signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
0
जोड़ा
धन्यवाद कृपया कम से कम मत देना। मैं नौसिखिया हूँ और अपना सर्वश्रेष्ठ प्रयास करने की कोशिश करता हूं।
जोड़ा लेखक Barish Ahsen, स्रोत
यह मौजूदा उत्तरों की तुलना में अधिक उपयोगी नहीं है। शायद आप बिना किसी जवाब के नए प्रश्नों का उत्तर देने का प्रयास कर सकते हैं?
जोड़ा लेखक Ray, स्रोत
कोई बात नहीं। आपका सबसे अच्छा यह है कि इस समुदाय को सम्मानित किया जाएगा :)
जोड़ा लेखक Ray, स्रोत