Appendice C. Esempio di Algoritmo di Codifica a Singolo Passaggio
Pseudocodice per la codifica a singolo passaggio, escludendo la gestione dei duplicati, la modalità non bloccante, il controllo del flusso del flusso dell'encoder disponibile e il tracciamento dei riferimenti.
Funzioni Ausiliarie
# Codifica un intero utilizzando il prefisso e la lunghezza specificati
encodeInteger(buffer, prefix, value, prefixLength)
# Codifica un'istruzione di inserimento nella tabella dinamica con indice di nome statico o dinamico opzionale (ma non entrambi)
encodeInsert(buffer, staticNameIndex, dynamicNameIndex, fieldLine)
# Codifica un riferimento all'indice statico
encodeStaticIndexReference(buffer, staticIndex)
# Codifica un riferimento all'indice dinamico relativo a Base
encodeDynamicIndexReference(buffer, dynamicIndex, base)
# Codifica un letterale con indice di nome statico opzionale
encodeLiteral(buffer, staticNameIndex, fieldLine)
# Codifica un letterale con indice di nome dinamico relativo a Base
encodeDynamicLiteral(buffer, dynamicNameIndex, base, fieldLine)
Algoritmo di Codifica
base = dynamicTable.getInsertCount()
requiredInsertCount = 0
for line in fieldLines:
staticIndex = staticTable.findIndex(line)
if staticIndex is not None:
encodeStaticIndexReference(streamBuffer, staticIndex)
continue
dynamicIndex = dynamicTable.findIndex(line)
if dynamicIndex is None:
# Nessuna voce corrispondente. Inserire+indicizzare o codificare letterale
staticNameIndex = staticTable.findName(line.name)
if staticNameIndex is None:
dynamicNameIndex = dynamicTable.findName(line.name)
if shouldIndex(line) and dynamicTable.canIndex(line):
encodeInsert(encoderBuffer, staticNameIndex,
dynamicNameIndex, line)
dynamicIndex = dynamicTable.add(line)
if dynamicIndex is None:
# Impossibile indicizzarlo, utilizzare letterale
if dynamicNameIndex is not None:
# Codifica letterale con nome dinamico, possibilmente sopra Base
encodeDynamicLiteral(streamBuffer, dynamicNameIndex,
base, line)
requiredInsertCount = max(requiredInsertCount,
dynamicNameIndex)
else:
# Codifica letterale con nome statico o nome letterale
encodeLiteral(streamBuffer, staticNameIndex, line)
else:
# Riferimento all'indice dinamico
assert(dynamicIndex is not None)
requiredInsertCount = max(requiredInsertCount, dynamicIndex)
# Codifica dynamicIndex, possibilmente sopra Base
encodeDynamicIndexReference(streamBuffer, dynamicIndex, base)
# Codifica prefisso
if requiredInsertCount == 0:
encodeInteger(prefixBuffer, 0x00, 0, 8)
encodeInteger(prefixBuffer, 0x00, 0, 7)
else:
wireRIC = (
requiredInsertCount
% (2 * getMaxEntries(maxTableCapacity))
) + 1
encodeInteger(prefixBuffer, 0x00, wireRIC, 8)
if base >= requiredInsertCount:
encodeInteger(prefixBuffer, 0x00,
base - requiredInsertCount, 7)
else:
encodeInteger(prefixBuffer, 0x80,
requiredInsertCount - base - 1, 7)
return encoderBuffer, prefixBuffer + streamBuffer
Spiegazione dell'Algoritmo
Questo algoritmo dimostra la logica di base di un encoder a singolo passaggio:
-
Inizializzazione: Impostare Base sul conteggio di inserimento corrente, inizializzare requiredInsertCount a 0.
-
Iterare le Righe di Campo: Per ogni riga di campo:
- Prima provare a trovare una corrispondenza completa nella tabella statica
- Se non trovata, cercare nella tabella dinamica
- Se nessuna delle due è trovata, decidere se inserire una nuova voce o utilizzare un letterale
-
Logica di Decisione:
- Corrispondenza Completa: Riferimento diretto (statico o dinamico)
- Nessuna Corrispondenza: Decidere se inserire nella tabella dinamica in base alla politica
- Solo Corrispondenza Nome: Utilizzare letterale con riferimento al nome
-
Codifica del Prefisso: Codificare il prefisso della sezione di campo in base ai valori di requiredInsertCount e Base.
-
Output: Restituire il buffer del flusso dell'encoder e la sezione di campo codificata (prefisso + rappresentazioni di righe di campo).
Punti Chiave
- Elaborazione a Singolo Passaggio: L'algoritmo prende decisioni di codifica e inserimento durante l'iterazione attraverso le righe di campo
- Tracciamento di Base: Utilizza il conteggio di inserimento come Base, consentendo l'indicizzazione Post-Base
- Strategia Flessibile: La funzione
shouldIndex()incapsula la strategia di indicizzazione, regolabile in base alle esigenze di implementazione - Conteggio dei Riferimenti:
requiredInsertCounttiene traccia dello stato massimo della tabella dinamica richiesto