Nasıl Python bayt bir dizi olarak bir tamsayı tedavi edilir?

oy
10

Ben Python os.wait () fonksiyonunun sonucu çözmeye çalışıyorum. Bu Python docs göre döndürür:

Bunu PID ve çıkış durumu göstergesini içeren bir demet: 16-bitlik bir sayı, olan düşük bayt olan yüksek bayt çıkış durumu sinyal işlemi öldüren numarası ve (sinyal sayısı sıfır olduğu takdirde); bir çekirdek dosyası oluşturulur ise düşük baytın yüksek bit ayarlanır.

Nasıl (bir tamsayı olduğu) yüksek ve düşük byte elde etmek çıkış durumu göstergesini deşifre edersiniz? spesifik olmak gerekirse, nasıl aşağıdaki kod parçacığı kullanılan kod çözme işlevini uygularım:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
Oluştur 13/08/2008 saat 16:46
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
11

İstediğin bu yapar:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8
Cevap 13/08/2008 saat 16:56
kaynak kullanıcı

oy
1

Sen kullanarak durumunu paketten bit değişen ve maskeleme operatörleri.

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

Ben bir Python programcısı değilim, bu yüzden sözdizimi doğru var umuyoruz.

Cevap 13/08/2008 saat 16:58
kaynak kullanıcı

oy
0

me've önce millet çivilenmiş, ama sen gerçekten bir satırda bunu istiyorsan, bunu yapabilirsiniz:

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

DÜZENLEME: Tersten vardı.

Cevap 13/08/2008 saat 17:14
kaynak kullanıcı

oy
11

Genel soruya cevap vermek için kullanabileceğiniz bit manipülasyon teknikleri:

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

Ancak, aynı zamanda orada yerleşik işlevler çıkış durumu değerleri yorumlamaya:

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

Ayrıca bakınız:

  • os.WCOREDUMP ()
  • os.WIFCONTINUED ()
  • os.WIFSTOPPED ()
  • os.WIFSIGNALED ()
  • os.WIFEXITED ()
  • os.WSTOPSIG ()
Cevap 13/08/2008 saat 17:52
kaynak kullanıcı

oy
2

Sen bulunan imzasız bayt bir dize halinde int kırmak alabilirsiniz yapı modülü:

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)

Ile size çift bu takdirde dizi modül daha elverişli yapabilirsiniz:

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])
Cevap 26/03/2009 saat 13:52
kaynak kullanıcı

oy
2
exitstatus, signum= divmod(status, 256)
Cevap 26/03/2009 saat 22:48
kaynak kullanıcı

oy
0
import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
Cevap 28/04/2018 saat 06:50
kaynak kullanıcı

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