En utilisant la bibliothèque zfec, j'ai essayé de générer un code de correction d'erreur qui peut être restauré même si certaines données sont endommagées.
La bibliothèque zfec utilise l'algorithme RAID-5 pour restaurer la corruption des données. L'algorithme Raid-5 peut être facilement compris en lisant ici. C'est un mécanisme simple qui utilise XOR, donc vous pouvez facilement le comprendre.
·de bonne heure ・ Il existe des API pour python, c, Haskel ・ Peut gérer des tableaux de caractères
https://pypi.python.org/pypi/zfec
pip install zfec
2DataBlock
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import zfec
#Correction de la détection d'erreur
data_block1 = str('aiueo')
data_block2 = str('kakik')
#Code de détection d'erreur des blocs de données 1 et 2:Générer 3
_, _, data_block3 = zfec.Encoder(2, 3).encode([data_block1, data_block2])
print 'data block 3 is... {}'.format(data_block3)
# >>> data block 3 is... uyI}g
#Bloc de données 1 et code de détection d'erreur:Restaurer 3 à 2
_, repaired_data_block2 = zfec.Decoder(2, 3).decode([data_block1, data_block3, ], [0, 2])
assert data_block2 == repaired_data_block2
#Bloc de données 2 et code de détection d'erreur:Restaurer 3 à 1
repaired_data_block1, _ = zfec.Decoder(2, 3).decode([data_block2, data_block3, ], [1, 2])
assert data_block1 == repaired_data_block1
5DataBlock
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import zfec
#Correction de la détection d'erreur
data_block1 = str('aiueo')
data_block2 = str('kakik')
data_block3 = str('ukeko')
data_block4 = str('sasis')
data_block5 = str('useso')
#Code de détection d'erreur des blocs de données 1 et 2:Générer 3
blocks = zfec.Encoder(5, 6).encode([data_block1,
data_block2,
data_block3,
data_block4,
data_block5])
ecc_block = blocks[-1]
print str('ecc block is... {}').format(ecc_block)
# >>> ecc block is... J?\j
#Bloc de données 1-Restaurer 5 à partir de 4 et blocs ECC
repaired_blocks = zfec.Decoder(5, 6).decode([data_block1,
data_block2,
data_block3,
data_block4,
ecc_block], [0, 1, 2, 3, 5])
assert data_block5 == repaired_blocks[4]
#Bloc de données 1,2,4,Restaurer 3 à partir de 5 et bloc ECC
repaired_blocks = zfec.Decoder(5, 6).decode([data_block1,
data_block2,
data_block4,
data_block5,
ecc_block], [0, 1, 3, 4, 5])
assert data_block3 == repaired_blocks[2]
Recommended Posts