كيف أتعامل مع عدد صحيح كصفيف من البايتات في بايثون؟

StackOverflow https://stackoverflow.com/questions/10123

  •  08-06-2019
  •  | 
  •  

سؤال

أحاول فك تشفير نتيجة وظيفة Python os.wait().يعود هذا وفقًا لمستندات Python:

صف يحتوي على معرف المنتج ومؤشر حالة الخروج:رقم 16 بت، البايت المنخفض الخاص به هو رقم الإشارة التي أنهت العملية، والبايت العالي الخاص به هو حالة الخروج (إذا كان رقم الإشارة صفرًا)؛يتم تعيين البت العالي للبايت المنخفض إذا تم إنتاج ملف أساسي.

كيف يمكنني فك تشفير مؤشر حالة الخروج (وهو عدد صحيح) للحصول على البايت العالي والمنخفض؟على وجه التحديد، كيف يمكنني تنفيذ وظيفة فك التشفير المستخدمة في مقتطف التعليمات البرمجية التالي:

(pid,status) = os.wait()
(exitstatus, signum) = decode(status) 
هل كانت مفيدة؟

المحلول

هذا سوف يفعل ما تريد:

signum = status & 0xff
exitstatus = (status & 0xff00) >> 8

نصائح أخرى

للإجابة على سؤالك العام، يمكنك استخدام التلاعب قليلا التقنيات:

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()
  • نظام التشغيل.WIFCONTINUED()
  • os.WIFSTOPPED()
  • نظام التشغيل.WIFSIGNALED()
  • نظام التشغيل.WIFEXITED()
  • os.WSTOPSIG()

يمكنك تقسيم 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)

إذا قمت بربط هذا مع مجموعة مصفوفة الوحدة يمكنك القيام بذلك بسهولة أكبر:

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])
exitstatus, signum= divmod(status, 256)

يمكنك فك الحالة باستخدام تحويل البت و قناع العاملين.

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

أنا لست مبرمج بايثون، لذا أتمنى أن تكون صياغة الجملة صحيحة.

لقد نجح الأشخاص الذين سبقوني في تحقيق ذلك، ولكن إذا كنت تريد ذلك حقًا في سطر واحد، فيمكنك القيام بذلك:

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

يحرر:لو كان إلى الوراء.

import amp as amp
import status
signum = status &amp; 0xff
exitstatus = (status &amp; 0xff00) &gt;&gt; 8
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top