Come faccio a convertire parte di una tupla pitone (array di byte) in un numero intero

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

  •  23-08-2019
  •  | 
  •  

Domanda

Sto cercando di parlare con un dispositivo utilizzando pitone. Mi è stato consegnato un tupla di byte che contiene le informazioni di memorizzazione. Come posso convertire i dati in valori corretti:

risposta = (0, 0, 117, 143, 6)

I primi 4 valori sono un int a 32 bit a dirmi quanti byte sono stati utilizzati e l'ultimo valore è la percentuale utilizzata.

posso accedere al tuple come risposta [0], ma non riesco a vedere come posso ottenere i primi 4 valori nella int ho bisogno.

È stato utile?

Soluzione

convertire i byte ai numeri virgola mobile in Python

Probabilmente si desidera utilizzare il modulo struct, per es.

import struct

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

Supponendo un unsigned int. Ci può essere un modo migliore per eseguire la conversione per spacchettare, una lista di comprensione con unirsi era solo la prima cosa che mi è venuta.

Modifica :. Si veda anche il commento di ΤΖΩΤΖΙΟΥ su questa risposta per quanto riguarda endianness così

Modifica # 2 : se non ti dispiace utilizzando il modulo matrice come bene, qui è un metodo alternativo che elimina la necessità di un elenco di comprensione. Grazie a @ JimB per aver ricordato che decomprimere può operare su array pure.

import struct
from array import array

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

Altri suggerimenti

Sarebbe,

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

soddisfare le vostre esigenze?

aiuto

OK, non è necessario specificare l'endinanness o se il numero intero è firmato o e (forse) è più veloce con il modulo struct, ma:

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

Si potrebbe anche fare uso del modulo array

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

(30095L,)

Questo appare come un lavoro per ridurre!

Quello che vi serve è fondamentalmente a, po-SHIFT un byte alla volta, e quindi aggiungere (oltre) il byte successivo nella sequenza.

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

Come sull'utilizzo della funzione di mappa:

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

Inoltre, non so se questo è siete alla ricerca di:

response = (0, 0, 117, 143, 6)
response[0:4]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top