2015-10-18 1 views
1

Goodday, Je dois porter le code C suivant en Python, mais je ne peux pas trouver un bon moyen de faire l'arithmétique char non signé qui ignore les bits de débordement dans python, c'est à dire. 255 + 1 = 0; 255 + 2 = 1 etc. Le code ci-dessous est utilisé dans un calcul de somme de contrôle pour un protocole implémenté en C sur l'Arduino avec lequel je dois m'interfacer.faire arithmétique char non signé en python

unsigned char b[length]; 
unsigned char c1=0,c2=0,c3=0,c4=0; 
for (i=0; i<length;i++) 
{ 
    c1+=b[i]; 
    c2+=c1; 
    c3+=c2; 
    c4+=c3; 
} 

Répondre

0

En Python il n'y a pas de notion signé/non signé. Si vous voulez gérer le débordement, vous pouvez simplement utiliser l'arithmétique modulaire.

(255 + 1) % 256 = 0 
(250 + 2) % 256 = 252 
(255 + 5) % 256 = 4 
3

Vous pouvez utiliser % 256:

>>> (255 + 1) % 256 
0 
>>> (255 + 2) % 256 
1 

Avec votre exemple, si b est une chaîne Python:

>>> b = "thisisatest" 
>>> c1, c2, c3, c4 = 0, 0, 0, 0 
>>> for c in b: 
...  c1 = (c1 + ord(c)) % 256 
...  c2 = (c2 + c1) % 256 
...  c3 = (c3 + c2) % 256 
...  c4 = (c4 + c3) % 256 
... 
>>> c1, c2, c3, c4 
... (181, 36, 46, 174) 
+0

La seule raison pour laquelle je ne l'ai pas ajouter cela comme une réponse, est que l'utilisation de ord (c) n'est pas bon (à mon humble avis) que les données seront bits de données non imprimables brutes sur le fil. C'est la raison pour laquelle j'ai utilisé unsigned char [] pour b. La réponse que j'ai choisie était pour des raisons génériques;) – Hvisage

+0

'ord()' fonctionnera avec "les données non-imprimables brutes": 'ord ('\ x00') == 0' (' \ x00' est un octet nul). – Pierre

1

Vous pouvez également utiliser AND binaire, qui pourrait être plus clair. J'aime aussi la notation hexadécimale pour cela.

255 & 0xff 
256 & 0xff 
257 & 0xff 
-1 & 0xff 
+0

Je suis upvoting celui-ci, mais il devrait être une réponse partagée;) – Hvisage