3.1.1.5. Repeat Offsets (Décalages répétés)
Comme décrit ci-dessus, les trois premières valeurs définissent les décalages répétés; nous les appelons Repeated_Offset1, Repeated_Offset2 et Repeated_Offset3. Ils sont classés par ordre de récence, Repeated_Offset1 représentant "le plus récent".
Si offset_value est 1, le décalage utilisé est Repeated_Offset1, et ainsi de suite.
Il y a une exception: lorsque la literals_length de la séquence actuelle est 0, les décalages répétés sont décalés de 1, donc:
- offset_value de 1 signifie Repeated_Offset2
- offset_value de 2 signifie Repeated_Offset3
- offset_value de 3 signifie Repeated_Offset1 - 1_byte
Initialisation
Pour le premier bloc, l'historique des décalages de départ est rempli avec les valeurs suivantes:
- Repeated_Offset1 = 1
- Repeated_Offset2 = 4
- Repeated_Offset3 = 8
Sauf si un dictionnaire est utilisé, auquel cas ils proviennent du dictionnaire.
Ensuite, chaque bloc obtient son historique de décalages de départ à partir des valeurs de fin du Compressed_Block le plus récent. Notez que les blocs qui ne sont pas des Compressed_Blocks sont ignorés; ils n'affectent pas l'historique des décalages.
Règles de mise à jour
Pendant l'exécution des séquences d'un Compressed_Block, les valeurs des Repeated_Offsets sont maintenues à jour afin qu'elles représentent toujours les trois décalages les plus récemment utilisés. Pour y parvenir, ils sont mis à jour après l'exécution de chaque séquence de la manière suivante:
Cas 1: Décalage non répété
Lorsque l'offset_value de la séquence ne fait pas référence à l'un des Repeated_Offsets (lorsqu'il a une valeur supérieure à 3, ou lorsqu'il a la valeur 3 et que la literals_length de la séquence est zéro):
- Les valeurs des Repeated_Offsets sont décalées d'un vers l'arrière
- Repeated_Offset1 prend la valeur du décalage qui vient d'être utilisé
Formule de mise à jour:
Repeated_Offset3 = Repeated_Offset2
Repeated_Offset2 = Repeated_Offset1
Repeated_Offset1 = nouveau décalage
Cas 2: Décalage répété
Lorsque l'offset_value de la séquence fait référence à l'un des Repeated_Offsets (lorsqu'il a la valeur 1 ou 2, ou lorsqu'il a la valeur 3 et que la literals_length de la séquence est non nulle):
- Les Repeated_Offsets sont réorganisés
- Repeated_Offset1 prend la valeur du Repeated_Offset utilisé
- Les valeurs existantes sont repoussées du premier Repeated_Offset vers le Repeated_Offset sélectionné par offset_value
Cela effectue efficacement une rotation d'enroulement en une étape de ces valeurs de décalage, de sorte que leur ordre reflète à nouveau leur récence d'utilisation.
Tableau d'exemple de mise à jour
Le tableau suivant montre les valeurs lors de l'application d'une série de séquences aux Repeated_Offsets:
| offset_value | literals_length | Repeated_Offset1 | Repeated_Offset2 | Repeated_Offset3 | Comment (Commentaire) |
|---|---|---|---|---|---|
| - | - | 1 | 4 | 8 | Valeur de départ |
| 1114 | 11 | 1111 | 1 | 4 | Non-répétition |
| 1 | 22 | 1111 | 1 | 4 | Répétition1; pas de changement |
| 2225 | 22 | 2222 | 1111 | 1 | Non-répétition |
| 1114 | 111 | 1111 | 2222 | 1111 | Non-répétition |
| 3336 | 33 | 3333 | 1111 | 2222 | Non-répétition |
| 2 | 22 | 1111 | 3333 | 2222 | Répétition2; échange 1 et 2 |
| 3 | 33 | 2222 | 1111 | 3333 | Répétition3; rotation 3 vers 1 |
| 1 | 0 | 2221 | 2222 | 1111 | Décalage analysé inséré |
| 1 | 0 | 2222 | 2221 | 3333 | Répétition2 |
Tableau 18: Repeated_Offsets
Traitement des cas particuliers
Cas literals_length = 0
Lorsque literals_length = 0, l'interprétation d'offset_value est décalée:
| offset_value | Décalage réellement utilisé |
|---|---|
| 1 | Repeated_Offset2 |
| 2 | Repeated_Offset3 |
| 3 | Repeated_Offset1 - 1 |
Ce traitement spécial est destiné à optimiser les opérations de copie de correspondance consécutives.
Points clés
- Principe de récence: Repeated_Offset1 est toujours le décalage le plus récemment utilisé
- Mise à jour automatique: L'historique des décalages est automatiquement mis à jour après chaque exécution de séquence
- Support de dictionnaire: Les valeurs initiales peuvent provenir du dictionnaire
- Décalage spécial: L'interprétation du décalage change lorsque literals_length=0