Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Manipulations d'octets

2 réponses
Avatar
Kevin Denis
Bonjour,

je dois manipuler des octets.
La liste d'opération à faire est la suivante:
-prendre un octet
-le XOR-er avec une valeur
-soustraire AA à ce résultat
-fournir le résultat final

La soustraction me pose un problème dans certain cas.

Si je prends pour exemple:
Valeur initiale: 0x6c
XOR: 0x41
Résultat: 0x2d

Et : 0x2d
moins : 0xaa
= FFFFFF83

La valeur qui m'intéresse dans le cas présent, c'est 0x83.

Comment faire ce calcul en python?

Merci
--
Kevin

2 réponses

Avatar
Nicolas
Bonjour,

Le 11/12/2013 22:00, Kevin Denis a écrit :
Bonjour,

je dois manipuler des octets.
La liste d'opération à faire est la suivante:
-prendre un octet
-le XOR-er avec une valeur
-soustraire AA à ce résultat
-fournir le résultat final

La soustraction me pose un problème dans certain cas.

Si je prends pour exemple:
Valeur initiale: 0x6c
XOR: 0x41
Résultat: 0x2d

Et : 0x2d
moins : 0xaa
= FFFFFF83

La valeur qui m'intéresse dans le cas présent, c'est 0x83.

Comment faire ce calcul en python?



Faire un AND 0xFF
i = 0x6C
r = ((i ^ 0x41) - 0xAA) & 0xFF
Merci

Avatar
Pierre Maurette
Kevin Denis :
Bonjour,

je dois manipuler des octets.
La liste d'opération à faire est la suivante:
-prendre un octet
-le XOR-er avec une valeur
-soustraire AA à ce résultat
-fournir le résultat final

La soustraction me pose un problème dans certain cas.

Si je prends pour exemple:
Valeur initiale: 0x6c
XOR: 0x41
Résultat: 0x2d

Et : 0x2d
moins : 0xaa
= FFFFFF83

La valeur qui m'intéresse dans le cas présent, c'est 0x83.

Comment faire ce calcul en python?



Vous définissez vos contraintes pas un exemple, on est obligé de faire
des hypothèses. Disons donc que vos octets sont une classe de 256
objets int, positifs et strictement entre 0 et 255. L'addition et la
soustraction se font classiquement, on additionne N en avançant N fois,
on soustrait N en reculant N fois, arrivé à 255 en avançant on passe à
0, arrivé à 0 en reculant on passe à 255. 3 moins 5 font 254, par
exemple. 255 plus 12 font 11. Je pense d'ailleurs que vous n'avez pas
de problème uniquement pour la soustraction.

Sans se compliquer à surcharger les opérateurs, vous pouvez utiliser
simplement:
def myadd(a, b): return (a + b) & 255
def mysub(a, b): return myadd(a, -b)

Si vous bossez plus longtemps sur le sujet, vous pouvez vous faire une
petite classe, en améliorant:

class u8(int):
def __new__(self, x):
return int.__new__(self, x & 255)
def __add__(self, x):
return int.__add__(self, x) & 255
def __sub__(self, x):
return self + (-x)

Attention, à l'utilisation, ça semble trop bien fonctionner, mais le
choix de l'opérateur n'est pas nécessairement évident. Bout de test:

a = u8(3105) #256 * 12 + 33
print a, u'(doit être 33)'
print
b = a + 240
print 'b', b
print 'a + b', a + b
print 'a - b', a - b
print '-a + b', -a + b
print 'a * -1 + b', a * -1 + b
print 'b - a', b - a
print 'u8(b) - a', u8(b) - a
print 'u8(-255)', u8(-255)
print 'u8(3 - 5)', u8(3 - 5)
print
b = u8(a + 240)
print 'b', b
print 'a + b', a + b
print 'a - b', a - b
print '-a + b', -a + b
print 'a * -1 + b', a * -1 + b
print 'b - a', b - a
print 'u8(b) - a', u8(b) - a
print 'u8(-255)', u8(-255)
print 'u8(3 - 5)', u8(3 - 5)

--
Pierre Maurette