Bonjour,
Aujourd'hui, bande de [censuré]s, je vais vous apprendre une manière simple de reconstitution CRC32.
CRC vient de l'expression anglaise Cyclic Redundancy Check : Vérification par redondance cyclique.
Et 32 est la taille en bits du résultat, 32 bits = 1 double-mot = 4 octets.
Assez perdu de temps. Ma méthode de recherche des valeurs nécessaires à la reconstitution crc32 procède comme suit:
On va supposer que nous ayons besoin d'une séquence d'octets égale à 0x0A2DD7CB en CRC.
Analysons le routine :
Code:
Structure Reg80x86
REAX
REBX
RECX
REDX
RFlags
RESI
REDI
REBP
RESP
EndStructure
Global CrcTable
Procedure RoutineCRC32(ASM.Reg80x86, *Message)
With ASM
\RESI = *Message
\REDX = -1
Repeat
\REAX = PeekB(\RESI)
\RESI + 1
\RECX = \REDX
\REAX & $FF
\RECX & $FF
\REAX ! \RECX ; On va l'appeler X...
\REDX >> 8
\REDX ! PeekL(\REAX << 2 + CrcTable)
Contagem - 1
Until Contagem = 0
EndWith
EndProcedure
On peut déterminer la dernière valeur de X en regardant le double-mot ayant $A0 en octet de poids de fort dans la table Crc,
par exemple $A0yyyyyy. On enregistre alors ce double-mot avec la partie yyyyyy. Pourquoi enregistrer aussi yyyyyy?
Parce que c'est la valeur qui subit l'opération OU EXCLUSIF avec un des autres double-mots pour obtenir $2DD7CB.
>> On effectue cette opération
>> On réalise ensuite l'operation jusqu'au dernier octet
>> On obtient la table suivante:
Code:
Valeur |Double-mot source |Position |Résultat de l'opé OU EXCLUSIF
---------|------------------|---------|-----------------------------
A02DD7CB |A00AE278 |E0 |002735B3
2735B300 |270241AA |71 |000037F2
37F20000 |37D83BF0 |EB |0000002A
2A000000 |2A6F2B94 |FB |00000000
Ok, les valeurs que nous obtenons sont ces valeurs X.
Et comme on a fait ce process en arrière-plan, on a besoin de mettre le résultat en arrière-plan aussi.
Donc nos valeurs sont $FB, $EB, $71 et $E0. On a donc juste besoin de recoder une routine Crc32 pour retrouver
les caractères qui doivent subir un OU EXCLUSIF avec le Crc actuel pour obtenir ces X et les remplacer durant l'exécution.
On pourra alors se permettre de traiter les bonnes valeurs. On a alors:
Code:
Define *Message
Define *Temporary
Define Contagem.L
Define ASM.Reg80x86
Contagem = MemorySize(Message)
With ASM
\RESI = *Message
\REDI = *Temporary
\REDX = -1
Repeat
\REAX = PeekB(\RESI)
\RESI + 1
\RECX = \REDX
If Contagem <= 4
PokeB(\REDI, \REAX)
\REDI + 1
\REAX & $FFFFFF00
\REAX | PeekB(\RESI - 1)
EndIf
\REDX >> 8
\REDX ! PeekL(\REAX << 2 + CrcTable)
Contagem - 1
Until Contagem = 0
EndWith
...
; Notes
Ma pratique actuelle en oenologie atteint un seuil qui ne me permet plus d'avancer grandement (NdT)
Il reste 2 AllocateMemory() à placer en début de code + insérer la structure Reg80x86 précisée dans 1er code.
PS: C'est quoi Crc32?...