L'objectif est d'être en mesure de le faire:opération Bitwise, le déplacement d'un bit de report
struct.pack('!H', x)
Mais si x
est supérieure à 65535
alors cela ne fonctionne pas pour des raisons évidentes.
Je ne suis pas un assistant avec la manipulation de bits, mais j'ai compris que les opérations <<
perdraient des bits décalés. Mais je n'ai aucune idée comment extraire un ou plusieurs bits porteurs de la chaîne binaire/octets et ajouter la valeur de report à l'ensemble de deux octets traînant les octets porteurs.
Et j'ai besoin de parcourir la chaîne d'octets par 2 octets à chaque fois et les additionner contre les deux octets précédents. Parfois, cela va générer une valeur supérieure à 65535
- c'est là que j'ai besoin d'extraire le bit de report du résultat - et effectuer une opération +
sur le résultat avec le bit de retenue lui-même (voir l'image ci-dessous).
C'est ce que je suis en train d'accomplir: (. Dans ce cas, le bit de transport était seul, et les 2 octets de fin recevrais +1
suite)
Et ce que je « ai jusqu'à présent:
from struct import unpack, pack
from binascii import *
even_bytes_string = b'\x45\x00\x00\x3c\x1c\x46\x40\x00\x40\x06\xac\x10\x0a\x63\xac\x10\x0a\x0c'
result = None
for i in range(0, len(even_bytes_string)-1,2):
if not result:
result = unpack('!H', even_bytes_string[i:i+2])[0]
continue
result += unpack('!H', even_bytes_string[i:i+2])[0]
if result > 65535:
# Got a carry bit.
pass
print(result)
print(pack('!H', result))
J'ai littéralement aucune idée comment faire cette tâche assez simple, sans convertir le résultat d'une opération d'ajout dans la représentation binaire réelle sous forme de chaîne (11001...
). Et puis faites la manipulation de la chaîne s = s[-16:]+s[:-16]
(simplifié à l'extrême), pour finalement le convertir en un ensemble de 2 octets. Il ne semble pas pratique, rapide ou très "correct". J'espère que l'un d'entre vous connaîtra la manipulation des bits en Python qui pourrait me dire quelle est la bonne façon de le faire. Il doit y en avoir.
Un peu plus confus image de ce que je suis en train d'accomplir (de garder résultat à 2 octets, coupant les bits transportant et en les ajoutant au résultat comme une valeur « séparée ».):
qu'attendez-vous si le dernier bit est 1 et non 0? – Tryph
@Tryph Je viens de réaliser que je suis simplement supposé ajouter les bits porteurs (peut-être plusieurs) aux deux ensembles d'octets. Donc, ma question a besoin d'une mise à jour. – Torxed
Peut-être que je pourrais utiliser 'carry = struct.pack ('! I', résultat) [: 2]'? Encore une fois, les coutures sont peu pratiques mais seraient mieux que la conversion en une représentation binaire et la manipulation de chaînes! – Torxed