Πώς μπορώ να αντιμετωπίζει έναν ακέραιο ως μια σειρά από bytes σε Python;

ψήφοι
10

Προσπαθώ να αποκωδικοποιήσουν το αποτέλεσμα της συνάρτησης Python os.wait (). Αυτό επιστρέφει, σύμφωνα με τα έγγραφα Python:

μια πλειάδα που περιέχει pid και κατάστασης εξόδου ένδειξη της: ένας αριθμός 16-bit, των οποίων η χαμηλή byte είναι ο αριθμός σήματος που σκότωσε τη διαδικασία, και των οποίων η υψηλή byte είναι η κατάσταση εξόδου (εάν ο αριθμός σήματος είναι μηδέν)? το υψηλό bit του χαμηλού byte έχει οριστεί αν παρήχθη ένα αρχείο πυρήνα.

Πώς μπορώ να αποκωδικοποιήσει την ένδειξη κατάστασης εξόδου (η οποία είναι ένας ακέραιος αριθμός) για να ληφθεί το υψηλό και το χαμηλό byte; Πιο συγκεκριμένα, πώς μπορώ να εφαρμόσουν τη λειτουργία αποκωδικοποίησης που χρησιμοποιείται στο ακόλουθο απόσπασμα κώδικα:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Δημοσιεύθηκε 13/08/2008 στις 18:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
11

Αυτό θα κάνει ό, τι θέλετε:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Απαντήθηκε 13/08/2008 στις 18:56
πηγή χρήστη

ψήφοι
1

Μπορείτε να αποσυμπιέσετε την κατάσταση χρησιμοποιώντας λίγο-μετατόπιση και συγκάλυψης φορείς.

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

Δεν είμαι Python προγραμματιστή, έτσι ελπίζω ότι πήρε η σύνταξη σωστή.

Απαντήθηκε 13/08/2008 στις 18:58
πηγή χρήστη

ψήφοι
0

Οι λαοί πριν me've είναι καρφωμένο, αλλά εάν θέλετε πραγματικά σε μία γραμμή, μπορείτε να το κάνετε αυτό:

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

EDIT: Αν είχε προς τα πίσω.

Απαντήθηκε 13/08/2008 στις 19:14
πηγή χρήστη

ψήφοι
11

Για να απαντήσουμε σε γενικές ερώτησή σας, μπορείτε να χρησιμοποιήσετε τη χειραγώγηση bit τεχνικές:

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 ()
Απαντήθηκε 13/08/2008 στις 19:52
πηγή χρήστη

ψήφοι
2

Μπορείτε να πάρετε σπάσει int σας σε μια σειρά από ανυπόγραφο bytes με το struct ενότητα:

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)

Εάν ζευγάρι αυτό με τη σειρά μονάδα, μπορείτε να το κάνετε αυτό πιο εύκολα:

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])
Απαντήθηκε 26/03/2009 στις 15:52
πηγή χρήστη

ψήφοι
2
exitstatus, signum= divmod(status, 256)
Απαντήθηκε 27/03/2009 στις 00:48
πηγή χρήστη

ψήφοι
0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Απαντήθηκε 28/04/2018 στις 07:50
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more