Python3 composizione word bit a bit

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Python3 composizione word bit a bit

Messaggio da SuperStep »

Salve, sto implementando un software che utilizza un protocollo di comunicazione per cui ad un certo punto devo spedire dei byte trattando singolarmente alcuni bit, dal momento che non ho mai lavorato cosi' a basso livello con il python3 chiedo aiuto a voi.

Il frame e' cosi' composto:

Codice: Seleziona tutto

+-------------------------------+
| 4 bit | 20 bit | 4 bit | 4bit |
+-------------------------------+
adesso, supponendo di voler aggungere tutti 0, ma facendolo parte per parte, come mi approccio?

- Grazie
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2926
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Python3 composizione word bit a bit

Messaggio da DoctorStrange »

Componi i bit come ti servono, poi li shifti a destra o sinistra, e poi coj una maschera di and componi pezzo dopo pezzo la variabile.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python3 composizione word bit a bit

Messaggio da Claudio_F »

SuperStep ha scritto:trattando singolarmente alcuni bit

Codice: Seleziona tutto

n |= 1 << b                 setta bit b di n (b da 0 a 31)
n ^= 1 << b                 inverte bit b di n
n &= 0xFFFFFFFF ^ (1 << b)  resetta bit b di n (con n lungo 32 bit)
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: Python3 composizione word bit a bit

Messaggio da SuperStep »

Claudio_F [url=http://forum.ubuntu-it.org/viewtopic.php?p=4954090#p4954090][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
SuperStep ha scritto:trattando singolarmente alcuni bit

Codice: Seleziona tutto

n |= 1 << b                 setta bit b di n (b da 0 a 31)
n ^= 1 << b                 inverte bit b di n
n &= 0xFFFFFFFF ^ (1 << b)  resetta bit b di n (con n lungo 32 bit)
ok, e se invece di trattare un bit alla volta, vorrei trattarli a gruppi di 4 o 20 (come nella separazione sopra)

per esempio, se nel primo quartetto, volessi inserire il valore 10 (1010), ma senza settare i due valori alti a mano, e soprattutto, utilizzando il formato bytes di python3 (utilizzo bytesarray per conservare ogni frammento dello stack)
come posso fare?

- Grazie
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python3 composizione word bit a bit

Messaggio da Claudio_F »

Se ho capito bene vuoi usare un bytearray di 4 byte in questo modo:

Codice: Seleziona tutto

     +-----------+-----------+-----------+-----------+
ba = | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |
     +-----------+-----------+-----------+-----------+
       ^  ^ ^                          ^   ^  ^ ^  ^
       |__| |__________________________|   |__| |__|
        4                20                 4    4
In tal caso si può scrivere il nibble alto del primo byte con il seguente codice (dove val è compreso tra 0 e 15):

Codice: Seleziona tutto

ba[0] = (ba[0] & 0x0F) | (val << 4)
Se invece val fosse un valore a 20 bit (0..1048575) da scrivere nel campo virtuale da 20 bit:

Codice: Seleziona tutto

ba[0] = (ba[0] & 0xF0) | (val >> 16)
ba[1] = (val >> 8) & 0xFF
ba[2] = val & 0xFF
La scrittura nei nibble alto e basso del quarto byte:

Codice: Seleziona tutto

ba[3] = (ba[3] & 0x0F) | (val << 4)
ba[3] = (ba[3] & 0xF0) | val
La riestrazione dei quattro valori:

Codice: Seleziona tutto

ba[0] >> 4
((ba[0] & 0x0F) << 16) | (ba[1] << 8) | ba[2]
ba[3] >> 4
ba[3] & 0x0F
Praticamente, a parte la mancanza del punto e virgola finale, è codice C ;)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti