كيف أقوم بتحويل جزء من Tuple Python (صفيف بايت) إلى عدد صحيح

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

  •  23-08-2019
  •  | 
  •  

سؤال

أحاول التحدث إلى جهاز باستخدام بيثون. لقد سلمت tuple bytes التي تحتوي على معلومات التخزين. كيف يمكنني تحويل البيانات إلى القيم الصحيحة:

استجابة = (0، 0، 117، 143، 6)

القيم الأربعة الأولى هي INT INT 32 بت أخبرني كم تم استخدام العديد من البايتات والقيمة الأخيرة هي النسبة المئوية المستخدمة.

يمكنني الوصول إلى tuple كاستجابة [0] ولكن لا أستطيع أن أرى كيف يمكنني الحصول على القيم الأربعة الأولى في INT ITS I.

هل كانت مفيدة؟

المحلول

يرى تحويل البايت إلى أرقام النقطة العائمة في بيثون

ربما تريد استخدام وحدة الهيكل، على سبيل المثال

import struct

response = (0, 0, 117, 143, 6)
struct.unpack(">I", ''.join([chr(x) for x in response[:-1]]))

على افتراض int غير موقعة. قد تكون هناك طريقة أفضل للقيام بالتحويل إلى تفريغها، وكان هناك فهم قائمة مع الانضمام هو مجرد أول شيء توصلت إليه.

تعديل: انظر أيضا تعليق ζζζτζιου على هذه الإجابة فيما يتعلق بالإختناع كذلك.

تحرير رقم 2: إذا كنت لا تمانع في استخدام وحدة الصفيف أيضا، فإليك طريقة بديلة توضح الحاجة إلى فهم قائمة. شكرا ل @جيمب للإشارة إلى أن تفريغ يمكن أن تعمل على صفائف أيضا.

import struct
from array import array

response = (0, 0, 117, 143, 6)
bytes = array('B', response[:-1])
struct.unpack('>I', bytes)

نصائح أخرى

سيكون،

num = (response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[3]

تلبية الاحتياجات الخاصة بك؟

يساعد

حسنا، أنت لا تحدد indinanness أو ما إذا كان عدد صحيح التوقيع أو (ربما) أسرع مع وحدة الهيكل ولكن:

b = (8, 1, 0, 0)
sum(b[i] << (i * 8) for i in range(4))

يمكنك أيضا الاستفادة من وحدة الصفيف

import struct
from array import array
response = (0, 0, 117, 143, 6)
a = array('B', response[:4])
struct.unpack('>I', a)

(30095L,)

هذا يبدو وكأنه وظيفة للحد من!

ما تحتاجه أساسا هو، تحول بت البايت في وقت واحد، ثم إضافة (إضافة) البايت التالي في التسلسل.

a = (0, 0, 117, 143, 6)
reduce(lambda x, y: (x<<8) + y, a)
7704326

ماذا عن استخدام وظيفة الخريطة:

a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)

أيضا، لا أعرف ما إذا كان هذا هو أنك تبحث عن:

response = (0, 0, 117, 143, 6)
response[0:4]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top